una recursión recursividad recursivas recursiva que funciones funcion ejemplos ejemplo crear javascript recursion

recursión - recursividad javascript ejemplos



Función recursiva llamada en JavaScript (2)

Esta es solo una forma en la que se construyen los motores JS particulares que usan los navegadores, sí. Sin la eliminación de la llamada de cola, tiene que crear un nuevo marco de pila cada vez que retroceda, mientras que con un bucle simplemente está configurando el contador del programa de nuevo al principio. Esquema, por ejemplo, tiene esto como parte de la especificación del lenguaje, por lo que puede usar la recursión de esta manera sin preocuparse por el rendimiento.

https://bugzilla.mozilla.org/show_bug.cgi?id=445363 indica que se está avanzando en Firefox (y Brendan Eich habla aquí acerca de que posiblemente se haga parte de la especificación ECMAScript), pero no creo que ninguno Los navegadores actuales tienen esto implementado todavía.

Sé que deberías ir con cuidado cuando hagas llamadas recursivas a funciones en JavaScript porque tu segunda llamada podría ser hasta 10 veces más lenta.

Elocuente JavaScript declara:

Hay un problema importante: en la mayoría de las implementaciones de JavaScript, esta segunda versión es aproximadamente 10 veces más lenta que la primera. En JavaScript, ejecutar un bucle simple es mucho más barato que llamar una función varias veces.

John Resig incluso dice que esto es un problema en this post.

Mi pregunta es: ¿Por qué es tan ineficiente usar la recursión? ¿Es así como se construye un motor en particular? ¿Alguna vez veremos un tiempo en JavaScript donde este no sea el caso?


Las llamadas a funciones son más caras que un simple bucle debido a la sobrecarga que supone cambiar la pila y configurar un nuevo contexto, etc. Para que la recursión sea muy eficiente, un lenguaje tiene que soportar alguna forma de eliminación de llamadas de cola, que básicamente significa transformar ciertos tipos de funciones recursivas en bucles. Los lenguajes funcionales como OCaml, Haskell y Scheme hacen esto, pero ninguna implementación de JavaScript lo conozco (solo sería marginalmente útil a menos que todos lo hicieran, así que quizás tengamos un problema con los filósofos).