Zitat von
axelf98:
Der Stacküberlauf hängt mit dem pred(x) zusammen:
Immer, wenn die Zahl nicht gerade ist, wird geprüft ob sie ungerade ist. Aber sie wird zuvor durch pred(x) wieder gerade gemacht, und deshalb hat man immer genau die falsche Zahl in der Abfrage und die Gehschichte geht ins unendliche...
Irgendwie scheinst du da was überlesen zu haben...
Die Zahl 43 wird an even übergeben. 43 mod 2 ist nicht 0, also wird der Vorgänger von 43 (42) an odd übergeben. Dort wird abgefragt, ob 42 mod 2 gleich 0 ist, und das ist der Fall, die Rekursion hört auf. Der Stacküberlauf tritt nur dann ein, wenn in einer Funktion "x mod 2 = 0" und in der anderen "x mod 2 <> 0" abgefragt wird, oder wenn in beiden "x mod 2 = 0" abgefragt wird, aber nicht pred benutzt wird.
So, wie n00b_on_knees' Funktionen vorher waren, hatte das mit dem pred absolut seine Richtigkeit, nur die Ausgabe war nicht ganz korrekt...
Das, was du an Code gepostet hast, ist von der Funktionsweise her identisch mit n00b_on_knees' Code, du hast nur pred ganz rausgelassen und in beiden Funktionen verschiedene Abfragen.
Übrigens ist sowas das scheinbar schlechteste Beispiel für indirekte Rekursionen. Die Rekursion ist (bei richtiger Implementierung
) nach maximal zwei Funktionsaufrufen (jeweils ein Aufruf von zwei Funktionen) erledigt, keine der Funktionen wird zweimal aufgerufen, geschweige denn mehrmals.
Und noch einfacher geht's mit der Funktion odd aus der
Unit system.pas