Halte
Jede Sprache, die Verschlüsse hat sie für trampolining verwenden, die eine Technik zur Refactoring Rekursion in Iteration ist. Dies kann Sie aus "Stack Overflow" -Problemen befreien, auf die naive Implementierungen vieler Algorithmen stoßen.
Ein Trampolin ist eine Funktion, die einen Verschluss zurück zum Aufrufer "springt". Die Schließung erfasst "den Rest der Arbeit".
Zum Beispiel in Python Sie einen rekursiven Akkumulator definieren können die Werte in einem Array zusammenfassen:
testdata = range(0, 1000)
def accum(items):
if len(items) == 0:
return 0
elif len(items) == 1:
return items[0]
else:
return items[0] + accum(items[1:])
print "will blow up:", accum(testdata)
Auf meinem Rechner scheißt dies mit einem Stack-Überlauf, wenn die Länge der Elemente überschreitet 998.
die gleiche Funktion kann in einem Trampolin-Stil mit Schließungen erfolgen:
def accum2(items):
bounced = trampoline(items, 0)
while (callable(bounced)):
bounced = bounced()
return bounced
def trampoline(items, initval):
if len(items) == 0:
return initval
else:
return lambda: trampoline(items[1:], initval+items[0])
Durch Rekursion Umstellung auf Iteration, Sie den Stapel nicht ausblasen. Der Abschluss hat die Eigenschaft, den Status der Berechnung in sich selbst zu erfassen, anstatt auf dem Stapel wie bei der Rekursion.
Dies sollte wahrscheinlich Community-Wiki sein. – notJim
Ich habe das gleiche gefragt. Diese Seite: http://php.net/manual/en/functions.anonymous.php hat ein Beispiel, aber es kann leicht ohne Schließungen umgeschrieben werden. – Galen