Citando de Code Complete 2,¿Cómo la recursión hace que el uso de la memoria en tiempo de ejecución sea impredecible?
int Factorial(int number) { if (number == 1) { return 1; } else { return number * Factorial(number - 1); } }
Además de ser lento[1] y haciendo el uso de la memoria de tiempo de ejecución impredecible[2], la versión recursiva de esta rutina es más difícil entender que la versión iterativa, que sigue:
int Factorial(int number) { int intermediateResult = 1; for (int factor = 2; factor <= number; factor++) { intermediateResult = intermediateResult * factor; } return intermediateResult; }
Creo que la parte lenta es debido a los gastos generales de la función de llamadas innecesarias.
Pero, ¿cómo la recursión hace que el uso de la memoria en tiempo de ejecución sea impredecible?
¿No podemos predecir siempre cuánta memoria se necesitaría (como sabemos cuando se supone que la recursión termina)? Creo que sería tan impredecible como el caso iterativo, pero ya no.
Tenga en cuenta que la recursividad PUEDE ejecutarse en tiempo constante SI el procedimiento usa recursividad final Y si el lenguaje admite la optimización de la llamada de cola. Busque "recursividad de la cola" si le interesa. – erjiang
Además, en algunas CPU como la función de Sparc, la sobrecarga de llamadas es muy baja. Y con algunos lenguajes de programación como Tcl, la función de llamada es en realidad más rápida que el código en línea (debido a cómo funciona el bytecompiler). – slebetman