Umschreiben einer rekursiven Funktion, ohne Verwendung von Rekursion
Bin ich umschreiben einige der bestehenden code in eine Einstellung, wo rekursive Aufrufe sind nicht so leicht umgesetzt noch angestrebt. (Und in Fortran 77, wenn Sie müssen wissen.) Ich habe gedacht, darum, einen Stapel von Grund auf zu verfolgen, Anrufe, notwendig, aber dieses scheint notdürftigem, und ich möchte lieber nicht reserviert Speicher für ein array in Fällen, in denen die Rekursion ist nicht tief. (Ich bin nicht überzeugt, dass Fortran 77 unterstützt das dynamische array-Dimensionierung entweder.)
Andere Vorschläge für eine Allgemeine Lösung auf, wie Sie ein offensichtlich rekursive Funktion und schreiben Sie es nicht-rekursiv ohne Platzverschwendung auf ein stack?
Vielen Dank,
Alte McSt
- Wenn es nicht verzweigen, können Sie in der Regel schreiben Sie in einer einfachen Schleife. Wenn es Zweige, die Sie benötigen in der Regel einen Stapel
- eine rekursive Funktion, die nicht verzweigen, wird, per definition, nie wieder...
- Denke, dass ich missbraucht das Wort Zweig. Ich meine, selbst mehrere Male aufgerufen, so dass der graph der Aufrufe wird zu einem Baum mit ästen. Und es ist nur meine Erfahrung und nicht immer wahr.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr code verwendet tail-Rekursion (das heißt, die Funktion gibt das Ergebnis eines jeden rekursiven Aufrufs direkt, ohne jede weitere Verarbeitung), dann ist es möglich, zu schreiben, die Funktion zwingend ohne stack:
In:
Ohne tail-Rekursion, mit einem stack (oder eine ähnliche Zwischenlagerung) ist die einzige Lösung.
Die klassische rekursive Funktion, die geschrieben werden kann als einer Schleife ist die Fibonacci-Funktion:
Aber ohne memoization dies dauert O(exp^N) Operationen mit O(N) stack-Speicher.
Kann umgeschrieben werden:
Aber das beinhaltet das wissen, wie die Funktion arbeitet, nicht sicher, ob es verallgemeinert werden kann, um einen automatischen Prozess.
Meisten rekursiven Funktionen leicht umgeschrieben, als Schleifen, als auf Platz verschwenden - das hängt von der Funktion ab, da viele (aber nicht alle) rekursive algorithmen tatsächlich davon abhängen, die Art der Speicherung (obwohl, die loop-version ist in der Regel effizienter in diesen Fällen auch).