Wie sieht Ihr Lieblings-Sprache Griff tief die Rekursion?

Ich habe vor kurzem angefangen zu lernen, Python und ich war ziemlich überrascht, eine 1000 Tiefe der Rekursion beschränken (Standard). Wenn du es hoch genug ist, über 30000, stürzt mit einem segmentation fault genau wie C. Obwohl C zu gehen scheint, sehr viel höher.

(Die Python-Leute sind schnell darauf hin, dass Sie immer konvertieren rekursive Funktionen an iterativ sind und dass Sie immer schneller. Das ist 100% wahr. Es ist nicht wirklich was meine Frage ist, aber.)

Habe ich versucht, das gleiche experiment in Perl und irgendwo um die 10 Millionen rekursionen es verbraucht alle meine 4 gigs ram und ich benutzt ^C, um zu versuchen zu stoppen. Klar Perl nicht mit dem C-stack, aber es wird eine lächerliche Menge Speicher, wenn es eine Rekursion -- nicht sehr schockierend, wenn man bedenkt, wie viel Arbeit es zu tun hat, zum aufrufen von Funktionen.

Habe ich versucht, in der Hecht-und war völlig überrascht, 100,000,000 rekursionen in etwa 2 Sekunden. Ich habe keine Ahnung, wie er das Tat, aber ich vermute, dass es abgeflacht ist, die Rekursion zu einer iterativen Prozess -- es scheint nicht zu verbrauchen jede extra Speicher, während Sie es tut. [Hinweis: der Hecht hat flatten trivialen Fällen, aber segfaults auf mehr kompliziert, oder so bin ich gesagt.]

Verwendet habe ich diese ansonsten nutzlose Funktionen:

int f(int i, int l) { if(i<l) return f(i+1,l); return i; }

sub f { return f($_[0]+1, $_[1]) if $_[0]<$_[1]; return $_[0] };

def f(i,l):
   if i<l:
     return f(i+1,l)
   return i

Ich bin sehr neugierig, wie andere Sprachen (z.B. PHP, Ruby, Java, Lua, Ocaml, Haskell) Griff Rekursion und warum Sie es behandeln, dass Art und Weise. Beachten Sie bitte außerdem, ob es einen Unterschied macht, ob die Funktion "tail-recursive" (siehe Kommentar).

  • Dein Beispiel ist tail-rekursiv ist, also jede Sprache, Implementierung, unterstützt tail-Rekursion effektiv transformieren der rekursive Aufruf in einem "goto".
InformationsquelleAutor jettero | 2008-10-24
Schreibe einen Kommentar