Recientemente comencé a aprender Python y me sorprendió bastante encontrar un límite de recursión de 1000 de profundidad (por defecto). Si lo configura lo suficientemente alto, alrededor de 30000, se bloquea con un error de segmentación como C. Aunque, C parece ir bastante más alto.¿Cómo maneja su idioma favorito la recursión profunda?
(La gente de Python son rápidos en señalar que se puede convertir siempre funciones recursivas a los iterativos y que son siempre más rápido. Eso es 100% verdad. No es realmente lo que mi pregunta es acerca de embargo.)
Probé el mismo experimento en Perl y alrededor de 10 millones de recursiones consumió todos mis 4 gigas de ram y usé^C para dejar de intentarlo. Claramente, Perl no usa la pila C, pero usa una cantidad ridícula de memoria cuando recurre, no terriblemente impactante considerando cuánto trabajo tiene que hacer para llamar a las funciones.
Probé en Pike y me sorprendió por completo obtener 100,000,000 recursiones en aproximadamente 2 segundos. No tengo idea de cómo lo hizo, pero sospecho que aplastó la recursión a un proceso iterativo, no parece consumir memoria extra mientras lo hace. [Nota: Pike hace aplanar casos triviales, pero segfaults en los más complicados, o eso me han dicho.]
que utilizan estas funciones de otro modo inútiles:
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
Tengo mucha curiosidad de cómo otros idiomas (por ejemplo, PHP, Ruby, Java, Lua, Ocaml, Haskell) manejan la recursividad y por qué la manejan de esa manera. Además, tenga en cuenta si hace una diferencia si la función es "recursiva de cola" (ver comentario).
Su ejemplo es recursivo de cola, por lo que cualquier implementación de lenguaje que admita recursividad de cola transformará efectivamente la llamada recursiva en un "goto". – mfx