a
и b
представляют текущий номер последовательности и следующий номер последовательности, начиная с 0
и 1
. n
- таймер обратного отсчета, который указывает, какой элемент последовательности Фибоначчи будет возвращен (например, n = 10
вернет 55
).
Эта функция работает, принимая аргумент n
, что означает, что она будет вычислять n-е число последовательности:
function fib(n) {
Затем код определяет функцию, которая будет вычислять следующее число в последовательности:
function(n,a,b) {
return n>0 ? arguments.callee(n-1,b,a+b) : a;
}
По сути, эта анонимная функция выполняет обратный отсчет n
на единицу каждый раз, когда она выполняется, и в то же время перемещается a
и b
к следующим числам в последовательности. Если n
равно 0
, последовательность завершена, и возвращается текущий номер a
.
arguments.callee относится к выполняемой в данный момент функции, так что код просто означает обратный вызов себя с новыми аргументами. Другими словами, для начала следующей итерации «цикла».
Наконец, говоря (n,0,1);
, код фактически вызывает fib
с параметрами n,0,1
. Оператор return
, который я исключил из приведенного выше фрагмента, принимает возвращаемое значение анонимной функции и возвращает его вызывающей стороне fib
.
<ч />
Тем не менее, использование рекурсии таким образом неэффективно для таких языков, как JavaScript, которые не имеют оптимизации хвостового вызова. Для больших n
было бы лучше написать это, используя стандартную циклическую конструкцию вместо рекурсии.