Konvertieren einer rekursiven Implementierung in eine schleifenbasierte Implementierung

8

Ich habe zwei Schnittstellen, die für das Halten einer Schließung verantwortlich sind

Hier ist der erste, der die Schließung hält, wenn es um eine Kartenoperation geht.

%Vor%

Und der zweite für Filteroperationen

%Vor%

Ich habe eine Klasse namens CList, die mit Closures arbeiten kann.

%Vor%

Hier ist meine öffentliche Schnittstelle, die CList mit Closures implementiert.

%Vor%

Und ein einfacher Tester:

%Vor%

Ich versuche, die map-Funktion, die rekursiv implementiert ist, in eine while-Schleife umzuwandeln. Ich nannte es maploop. Es schmerzt mein Gehirn für zwei Tage. Jeder Hinweis wird mich sehr glücklich machen. Ich stelle diese Frage hier, da es eine Wahrscheinlichkeit gibt, dass jemand Dan Grossman Kurs nehmen und das Beispiel sehen und versuchen kann, diese Funktion zu implementieren. Ich bevorzuge einen Hinweis als eine tatsächliche Antwort. Danke.

    
cgon 05.04.2013, 15:03
quelle

2 Antworten

6

Wenn Sie eine rekursive Funktion in eine iterative Funktion konvertieren, müssen Sie prüfen, welcher Nicht-Tail-Aufruf-Status erforderlich ist. Erstellen Sie dann einen Stapel und schieben Sie die Zustände auf den Stapel und codieren Sie ihn wie sonst auch die rekursive Funktion. Wenn Sie mehrere rekursive Aufrufe in der Funktion haben, müssen Sie Ihr neues Statuselement auch einen Wert enthalten, der angibt, an welchem ​​Punkt der Funktion Sie sind.

In diesem Fall haben Sie nur einen rekursiven Aufruf, und der einzige Zustand ist xs , also sind die Dinge ziemlich einfach und Sie brauchen kein benutzerdefiniertes Zustandsobjekt.

So würde ich Dinge tun (nicht getestet).

%Vor%     
Antimony 05.04.2013, 15:07
quelle
0

Der Standardansatz, um ein rekursives Programm in ein iteratives Programm zu transformieren, ist eine tail-rekursive Variante. Betrachten Sie als sehr einfaches Beispiel die folgende rekursive faktorielle Funktion, um N! zu berechnen:

%Vor%

Rufen Sie factorial(N); auf.

Um dieses Tail-Recursive zu machen, müssen Sie eine Akkumulationsvariable hinzufügen:

%Vor%

Rufen Sie tailRecursiveFactorial(N, 1);

auf

Dieser wird einfach in ein iteratives Programm umgewandelt:

%Vor%

Natürlich ist Ihr Problem um einiges schwieriger, aber der allgemeine Ansatz sollte trotzdem funktionieren.

    
Vincent van der Weele 05.04.2013 15:25
quelle

Tags und Links