Ihr zweiter Algorithmus erstellt eine n
-lange Kette von Lambda-Prozeduren, die jeweils einen Verweis auf die vorherige enthält. Ich weiß nicht genau, was Ruby macht, aber in einer richtig tail-rekursiven Sprache würde der Stack in deinem zweiten Algorithmus nicht überlaufen, weil k.call
im Lambda auch in der Endposition ist. Wenn, wie Brians Experiment nahelegt, Ruby keine richtigen Tail Calls hat, wird die lange Kette verschachtelter Aufrufe an Lambda den Stack überschwemmen, wenn der Kopf der Kette aufgerufen wird, obwohl Ruby schlau genug ist, den Tail zu konvertieren -rekursiv factorial
Aufruf in eine Schleife (= Tail-Call-Optimierung).
Überlauf? oder StackOverflow ?! –
-1, gehört zu uservoice. –