Wie man mit der Rekursivität umgehen kann

8

Hier ist eine sehr einfache rekursive Funktion:

%Vor%

Wenn ich es als Schließung konvertieren möchte:

%Vor%

Ich habe einen Compiler-Fehler: "Variable innerhalb ihres eigenen Anfangswertes verwendet"

    
Luc-Olivier 03.08.2014, 09:54
quelle

5 Antworten

10

Sie können es umgehen mit zwei Schritt Zuweisung

%Vor%

oder Sie können Y Kombinator

%Vor%

Dies ist eine Umgehung des Speicherleckproblems, das @zneak gefunden hat (Es ist kein Speicherleck vorhanden, aber der falsche Wert wurde erfasst)

%Vor%     
Bryan Chen 03.08.2014 09:59
quelle
9

BEARBEITEN Dies wurde mit Swift 2 unter Verwendung lokaler Funktionen behoben. Apple schlägt diesen Code vor:

%Vor%

Obwohl dies aus dem aktuellen Beispiel nicht offensichtlich ist, erfassen sogenannte lokale Funktionen die Locals des umschließenden Bereichs.

Die Verwendung einer Ortungsfunktion führt nicht zu einem Leck, während eine Schließung dies tun würde. Allerdings kann lap in diesem Fall nicht neu zugewiesen werden.

Ich habe eine E-Mail von Apples Joe Groff erhalten, in der es heißt, dass es weiterhin geplant sei, Schließungen als schwache und veränderbare Variablen bei einem zu erfassen späterer Punkt. Dies bestätigt jedoch, dass es momentan keine Möglichkeit gibt, dies zu tun, außer mit einer lokalen Funktion.

Ihre aktuelle Lösung enthält ein Speicherleck: Die Schließung von lap hat einen starken Verweis auf sich selbst, was bedeutet, dass sie niemals freigegeben werden kann. Dies kann leicht überprüft werden, indem das folgende Programm mit dem beigefügten Leaks-Instrument gestartet wird:

%Vor%

Leider, wie die explizite Capture-Syntax kann nicht auf Closure-Typen angewendet werden (Sie erhalten einen Fehler, der besagt, dass '' unowned 'nicht auf Nicht-Klassen-Typ' (Int) - & gt; Int '" angewendet werden kann) scheint kein einfacher Weg zu sein, dies zu erreichen, ohne zu lecken. Ich habe einen Fehlerbericht darüber eingereicht.

    
zneak 03.08.2014 10:33
quelle
3

Hier ist eine Antwort auf meine eigene Frage:

%Vor%     
Luc-Olivier 03.08.2014 10:13
quelle
0

Was ist damit?

%Vor%

Es ist ziemlich einfach, ich habe gerade eine rekursive lokale Funktion innerhalb einer Schließung definiert, die die Funktion zurückgibt.

Allerdings muss ich sagen, dass die Antwort von @Bryan Chen über den Y-Kombinator großartig ist.

    
FranMowinckel 10.07.2016 14:43
quelle
0

Ich hatte das gleiche Problem und war nicht mit irgendetwas, das da draußen war, zufrieden. Also habe ich eine Bibliothek erstellt und sie auf GitHub .

Mit dieser Bibliothek (mit Swift 3.0) würde Ihr Code wie folgt aussehen:

%Vor%     
riisemichi 26.11.2016 01:10
quelle

Tags und Links