Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Binäre rekursive Suche
Platinum - Fr 01.05.09 14:43
Titel: Binäre rekursive Suche
Heute morgen konnte mir ja bei der "normalen" Binären Suche geholfen werden, ich hoffe das klappt auch jetzt :X
Ich bin die Binäre Suche jetzt rekursiv am Programmieren, der Code dürfte an sich stimmen, nur glaube ich ein Fehler im Funktionsaufruf zu haben :X Ich habe mich schon dumm und dämmlich gegoogelt (
http://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Prozeduren_und_Funktionen hat ein wenig geholfen), nur bekomme ich folgende Fehler nicht weg:
-[Hinweis] Project1.dpr(18 ): H2077 Auf 'r' zugewiesener Wert wird niemals benutzt
-[Hinweis] Project1.dpr(19): H2077 Auf 'l' zugewiesener Wert wird niemals benutzt
-[Warnung] Project1.dpr(20): W1035 Rückgabewert der Funktion 'Suche' könnte undefiniert sein
-[Warnung] Project1.dpr(47): W1035 Rückgabewert der Funktion 'Suche' könnte undefiniert sein
Es liegt bestimmt nur an einer kleinigkeit, aber ich sehe sie nicht :X Hoffe jemand ist nicht ganz so blind wie meiner einer :)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
function Suche(l,r:extended):extended; Var a:array[1..10] of integer; x,m:integer; gefunden:boolean;
function Suche(l,r:extended):extended; Begin m:=(TRUNC((l+r)/2)); if x = a[m] then Gefunden := True else if x<a[m] then r := m - 1 else l := m + 1; end;
begin
x:=7; l:=1; r:=10; gefunden:=false;
for m:= 1 to TRUNC(r) do begin a[m]:=m; writeln(m,'.) ', a[m]); end;
if gefunden then begin writeln('Die gesucht Zahl ist vorhanden und befindet sich an der ',m,' ten Stelle.'); writeln('Die gesuchte Zahl lautet: ',x); gefunden:=true; end else if not gefunden then Suche(l,r);
readln; end;
end. |
Hidden - Fr 01.05.09 15:14
Hi :)
Dass du die inline deklarierte Funktion in "Suche" ebenfalls "Suche" genannt hast, muss praktisch zu Fehlern führen. Kann ja niemand wissen, welche jetzt bei einem Aufruf innerhalb von Suche gemeint ist ;)
Die Fehlermeldung mit "Rückgabewert könnte undefiniert sein" stimmt so: Du weist nirgends einen Wert zu. Bei Funktionen existiert jedoch immer eine Variable "result", deren Inhalt am Ende zurückgegeben wird. Deshalb könntest du auch schreiben:
x := Suche(5, 13) * pi / 4;.
Solange du den Wert wirklich nicht benötigst, könntest du aus Suche eine Prozedur machen, das sollte das Problem lösen. Wenn du noch nicht weißt, was eine Prozedur ist, wäre das hier eventuell etwas für dich:
Crashkurs von Christian S. [
http://www.christian-stelzmann.de/artikel/CrashkursReloaded/].
mfG,
Platinum - Fr 01.05.09 15:53
Danke für die Antwort, aber irgendwie stehe ich auf dem Schlauch.
Kannst du mir ein ganz simples Beispiel schreiben, das eine "for-Schleife" rekursiv nachstellt ?
Also in der function würde i:= i+1 stehen und das "Hauptprogramm" ruft die funktion solange auf bis i=5.
Sry, aber irgendwie bin ich gerade verwirrt :D
JayEff - Fr 01.05.09 16:17
Platinum hat folgendes geschrieben : |
Kannst du mir ein ganz simples Beispiel schreiben, das eine "for-Schleife" rekursiv nachstellt ?
Also in der function würde i:= i+1 stehen und das "Hauptprogramm" ruft die funktion solange auf bis i=5. |
Ich vermute, du meinst sowas:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function recursive_for1(i : Integer): Integer; begin if i < 5 then result := recursive_for1(i+1) else result := 5; end;
procedure recursive_for2(var i: Integer); begin i := i + 1; if i < 5 then recursive_for2(i); end; |
Das sollte so funktionieren. Aufruf immer z.B. mit 0. In der prozedur ist i ein var-Parameter, das heißt, wenn ich eine Zuweisung auf i mache, wird die Zuweisung auf die Variable gemacht, die ich der Prozedur gegeben hab. Klar, dass du die Prozedur dann nur mit einer Variable aufrufen kannst und nicht so:
recursive_for2(1);
Edit: Fehler korrigiert :oops:
Platinum - Fr 01.05.09 16:35
Danke für die Antwort.
Ich hab deinen Code jetzt stupide copy&paste in meine "Konsolenanwendung" kopiert, es kommen auch keine Fehler. Um den Wert von i zu überprüfen habe ich ein "writeln(i);" in die Prozedur eingefügt, und in das "Hauptprogramm" ein "readln", damit mir das Fenster nicht vor der Nase zuklappt.
Das Problem: es passiert rein gar nichts in meinem Konsolenfenster :( Nach dem ich den Code ausführe gehts auf und bleibt aufgrund des "readln" auch offen bis ich enter drücke :(
Genau das gleiche passiert bei meinem Code auch... was mach ich nu falsch ? -.-#
JayEff - Fr 01.05.09 16:39
Platinum hat folgendes geschrieben : |
Genau das gleiche passiert bei meinem Code auch... was mach ich nu falsch ? -.-# |
Zeig mal deine Änderungen an meinem Code, bzw deine ganze Testanwendung in der du meinen Code benutzt :nixweiss:
Platinum - Fr 01.05.09 16:44
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| program Project1;
{$APPTYPE CONSOLE}
uses SysUtils; procedure recursive_for2(var i: Integer); begin i := i + 1; writeln(i); if i < 5 then recursive_for2(i); end;
begin readln; end. |
das wärs
JayEff - Fr 01.05.09 16:47
Musst die Prozedur schon auch aufrufen :roll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| program Project1;
{$APPTYPE CONSOLE}
uses SysUtils; procedure recursive_for2(var i: Integer); begin i := i + 1; writeln(i); if i < 5 then recursive_for2(i); end;
var x : Integer; begin x := 0; recursive_for2(x); readln; end. |
Platinum - Fr 01.05.09 16:51
ok,das war eindeutig... genug für heute ;)
danke, ich mach erstmal ne pause^^
Marc. - Fr 01.05.09 16:56
Wobei es auch ohne Var-Parameter klappt. Der nutzt dir IMHO sowieso nichts, außer dass am Ende in deiner Variablen X fünf steht!
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure recursive_for2(i: Integer); begin writeln(i); if i < 5 then recursive_for2(i+1); end; |
JayEff - Fr 01.05.09 16:57
Marc. hat folgendes geschrieben : |
Wobei es auch ohne Var-Parameter klappt. Der nutzt dir IMHO sowieso nichts, außer dass am Ende in deiner Variablen X fünf steht! |
Schon richtig, aber wenn ich ein Beispiel je mit Funktion und Prozedur mache, dann sollten beide das gleiche können, oder? ;)
Marc. - Fr 01.05.09 17:00
JayEff hat folgendes geschrieben : |
Schon richtig, aber wenn ich ein Beispiel je mit Funktion und Prozedur mache, dann sollten beide das gleiche können, oder? ;) |
Kommt davon, wenn man sich nur den letzten Beitrag durchließt. :oops:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!