a
y b
representan el número actual de la secuencia y el siguiente número de la secuencia, a partir de 0
y 1
. n
es un temporizador de cuenta atrás que especifica qué elemento de la secuencia de Fibonacci será devuelto (EG: n = 10
volverá 55
).
Esta función funciona mediante la aceptación de un argumento n
lo que significa que calcular el número n de la secuencia:
function fib(n) {
continuación, el código define una función que calcula el siguiente número de la secuencia:
function(n,a,b) {
return n>0 ? arguments.callee(n-1,b,a+b) : a;
}
Básicamente esta función anónima cuenta atrás n
por uno cada vez que se está ejecutando, mientras que al mismo tiempo mueve a
y b
a los siguientes números en t la secuencia. Si n
es igual a 0
, entonces la secuencia se completa y se devuelve el número actual a
.
arguments.callee se refiere a la función que se está ejecutando actualmente, por lo que el código solo significa volver a llamar a sí mismo con los nuevos argumentos. En otras palabras, para comenzar la próxima iteración del "bucle".
Finalmente, al decir (n,0,1);
el código está llamando al fib
con los parámetros n,0,1
. La instrucción return
, que dejé fuera del fragmento anterior, toma el valor de retorno de la función anónima y la devuelve a la persona que llama de fib
.
Dicho esto, el uso de la repetición de esta manera es ineficiente para lenguajes como JavaScript que no tienen la optimización de llamada de cola. Para grandes n
sería mejor escribir esto usando una construcción de bucle estándar en lugar de recursión.
JavaScript finalmente tiene Optimización de llamadas de cola desde ES6: http://benignbemine.github.io/2015/07/19/es6-tail-calls/ –
El lenguaje puede admitirlos, pero muchas implementaciones todavía no: https : //kangax.github.io/compat-table/es6/ –