Autor |
Beitrag |
Platinum
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 01.05.09 14:43
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 ( de.wikibooks.org/wik...duren_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
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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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..
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Platinum 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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 
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 01.05.09 16:17
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Platinum 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 01.05.09 16:39
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Platinum 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 01.05.09 16:47
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Platinum 
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 01.05.09 16:51
ok,das war eindeutig... genug für heute
danke, ich mach erstmal ne pause^^
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 01.05.09 16:57
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 01.05.09 17:00
|
|