qualunque lingua che comprende chiusure possano usarli trampolino, che è una tecnica per refactoring ricorsione in iterazione. Questo può farti uscire dai problemi di "stack overflow" in cui si imbattono in ingenue implementazioni di molti algoritmi.
Un trampolino è una funzione che "rimbalza" una chiusura indietro al suo chiamante. La chiusura cattura "il resto del lavoro".
Ad esempio, in Python è possibile definire un accumulatore ricorsiva per sommare i valori in una matrice:
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)
Sulla mia macchina, questa craps con un overflow dello stack quando la lunghezza di elementi supera 998.
la stessa funzione può essere fatto in uno stile trampolino utilizzando chiusure:
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])
convertendo la ricorsione per iterazione, non spegnere la pila. La chiusura ha la proprietà di catturare lo stato del calcolo in sé stesso piuttosto che in pila come con la ricorsione.
fonte
2010-09-30 18:34:39
Probabilmente questo dovrebbe essere wiki della comunità. – notJim
mi sono chiesto la stessa cosa. Questa pagina: http://php.net/manual/en/functions.anonymous.php ha un esempio, ma può essere facilmente riscritta senza chiusure. – Galen