![]() |
Rekursion zu Iteration
Hi Leute,
ich hab schon gegoogelt und die Forensuche bemüht, aber eventuell mit den falsche Suchbegriffen. Ich suche nach einem Verfahren, wie ich jegliche Rekursion iterativ mache. Dabei soll es egal sein, welchen Grad die Rekursion hat. Es geht in meinem Beispiel um eine dreigradige Rekursion. Gibt es nun ein allgemeines Schema, mit dem ich eine Rekursion zu einer Iteration mache, oder geht das nur mit jede Menge Gehirnschmalz? mfg, tia, Martin |
Re: Rekursion zu Iteration
Naja, die gelehrten Köpfe streiten sich doch immer noch, ob beweisbar jede Rekursion zu einer Iteration gemacht werden kann.
Also würd ich schon sagen, jede menge Hirnschmalz. Aber ich glaube, du solltest sie dir zumindest iterativ nachbilden können, indem du einen eigenen Stack anlegst und dann das ganze in eine while-schleife verpackst. Zumindest so vom Ansatz her :stupid: müsste das gehen, wenn du eine weitere Rekursion dadurch anstößt, dass du den stack mit entsprechenden daten pushst und ein Break; setzt. Am nede der rekursion, sprich am ende des blockes innerhalb der while-schleife, wird der stack dann abgebaut. |
Re: Rekursion zu Iteration
naja, der vorschlag mit dem stack würde bedeuten, dass du eine iteration so baust, dass sie die nachteile der rekursion nachbildet. also nichts gewonnen, nur verloren.
|
Re: Rekursion zu Iteration
Also gibt es da kein einfaches Verfahren? Schade. :(
Dann werd ich wohl mal meine kleinen grauen Zellen anstrengen müssen. Danke für die schnellen Antworten. |
Re: Rekursion zu Iteration
Imho ist man sich wohl mittlerweile einig, dass man
a) jede Rekursion auch iterativ darstellen kann und umgekehrt (wobei der Aufwand oft in keinem Verhältnis steht) und b) es keine allgemeingültige Methode, gibt nach der dies geschehen kann. Will heissen: Möglich isses, muss aber für jeden konkreten Fall betrachtet werden. |
Re: Rekursion zu Iteration
Es gibt allerdings immer die Möglichkeit, die Endrekursion zu vermeiden.
Beispiel:
Delphi-Quellcode:
dies kann so übersetzt werden:
procedure MachwasRekursiv(parameter);
begin BerechneSchritt1; if rekusionsbedingung then MachwasRekursiv(neueparameter); end;
Delphi-Quellcode:
Bei der Beseitigung der Endrekursion setzt man also einfach die (Funktions-)Parameter auf die neuen Wert und steigt in der Funktion oben wieder ein.
procedure MachwasIterativ(parameter);
begin repeat BerechneSchritt1; parameter := neueparameter; until not rekusionsbedingung; end; Hier ist durchaus der GOTO-Befehl erlaubt, da er unnötiges Zuweisen der neuen Parameter vermeidet.
Delphi-Quellcode:
Wenn es sich nicht um eine Endrekursion handelt, kann dieses Verfahren nicht funktionieren:
procedure MachwasIterativ(parameter);
Label start; begin start: BerechneSchritt1; if rekursionsbedingung then begin parameter := neueparameter; Goto Start; end; end;
Delphi-Quellcode:
procedure MachwasRekursiv(parameter);
begin BerechneSchritt1; if rekusionsbedingung then MachwasRekursiv(neueparameter); BerechneSchritt2; // wegen dieser Anweisung liegt KEINE Endrekursion vor end; |
Re: Rekursion zu Iteration
Zitat:
Goto hat in Delphi / Pascal eigentlich nix zu suchen.
Delphi-Quellcode:
oder zur Not:
repeat
BerechneSchrit1; if RekursionsBedingung then Parameter := NeuerParameter; until not RekursionsBedingung;
Delphi-Quellcode:
var weiter: Boolean;
... repeat BerechneSchrit1; weiter := KomplizierteRekursionsBedingung; if weiter then Parameter := NeuerParameter; until not weiter; |
Re: Rekursion zu Iteration
Hm, das sind ja jetzt alles allgemeine Beispiele zur 1fachen Rekursion, gibt es dass auch zur 3fachen Rekursion und dann so übersetzt in die Iteration?
|
Re: Rekursion zu Iteration
Was verstehst Du denn unter 3fach Rekursion?
|
Re: Rekursion zu Iteration
Sorry, hab mich falsch ausgedrückt, ich meinte 3 gradige Rekursion, also:
Delphi-Quellcode:
EDIT: Das mit der Rekursion ist aber auch vertrackt :wall:
procedure recursion(n: paramter);
begin if not (Endbedingung) then begin recursion(modify1(n)); recursion(modify2(n)); recursion(modify3(n)); end; end; |
Re: Rekursion zu Iteration
Zitat:
Die Procedure Recursion ist also iterativ! (Eine Funktion ist erst dann rekursiv, wenn sie sich selbst aufruft, nicht weil sie recursion heißt. ;-)) Wenn recurse1 bis recurse3 jeweils nur eine einfache EndRekursion sind und modifyX keine Rekursive Funktion, dann brauchst Du doch nur die 3 rekursiven Procedure auf Iteration umzustellen. Fertig |
Re: Rekursion zu Iteration
sorry... (hatte Zitat statt Edit gedrückt :duck: )
|
Re: Rekursion zu Iteration
Großer Fehler, hab mich total verhauen mit der Rekursion und hab's oben geändert.
|
Re: Rekursion zu Iteration
Hi,
nimm einfach die Ackermann-Funktion. Die ist gut rekursiv und nicht uninteressant (gab hier mal die Diskussion ob diese iterativ dargestellt werden kann). Die erfüllt (imho) alle Schwierigkeiten, die man so an eine rekursive Funktion stellen kann und es gab wenn ich mich richtig erinnere auch eine iterative Lösung. Weiß leider nicht mehr wer die gefunden hatte (ich weiß noch dass ich deren Existenz anzweifelte). Da wurde dann auch darüber diskuttiert, ob denn jede rekursive Funktion auch iterativ gelöst werden könnte und zumindest für alle Endlichen Fälle müsste das möglich sein. Wie schon gesagt wurde, es gibt leider kein Verfahren, dass immer und für jeden Fall funktioniert. Gruß Der Unwissende |
Re: Rekursion zu Iteration
Zitat:
![]() |
Re: Rekursion zu Iteration
[OT]
Zitat:
Beim Beweis mit der CPU wußte ich noch, dass der von dir kam, bei dem anderen war ich mir nicht 100%ig sicher (wußte aber auch noch, dass du da einige gute Argumente hattest und wohl immer noch hast). Gruß Der Unwissende [/genug OT] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz