Мне трудно понять порядок вызовов в рекурсивном программировании в Javascript
Играя с рекурсивным программированием в Javascript, я хотел найти решение для случая использования Фибоначчи. Фибоначчи - это всего лишь пример использования, чтобы проиллюстрировать мой вопрос. Но вопрос о рекурсивном программировании в JS, а не об алгоритме Фибоначчи.
Учитывая номер индекса N, вернуть соответствующее значение последовательности Фибоначчи, где последовательность: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 , 144, ...).
Что я и сделал со следующим решением (знаю, что смогу улучшить его с помощью заметок, чтобы избежать экспоненциальной сложности):
function fibonacci(n) {
if (n <= 1) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
Поскольку я хотел понять это лучше, я начал добавлять console.log()
в мой код. И вот тогда произошло потрясение ума. *
Порядок звонков, счетчик и шаги не имеют для меня никакого смысла!
function fibonacci(n, caller = 'initalFibonacciCaller', step = 0) {
console.log(caller)
console.log('n =', n)
console.log('step =', step)
console.log('----------------')
if (n <= 1) return 1;
step++
return fibonacci(n-1, 'fibonacciCaller1', step) + fibonacci(n-2, 'fibonacciCaller2', step);
}
console.log('=>', fibonacci(4))
Ответ:
initalFibonacciCaller
n = 4
step = 0
----------------
fibonacciCaller1
n = 3
step = 1
----------------
fibonacciCaller1
n = 2
step = 2
----------------
fibonacciCaller1
n = 1
step = 3
----------------
fibonacciCaller2
n = 0
step = 3
----------------
fibonacciCaller2
n = 1
step = 2
----------------
fibonacciCaller2
n = 2
step = 1
----------------
fibonacciCaller1
n = 1
step = 2
----------------
fibonacciCaller2
n = 0
step = 2
----------------
5
Почему с step3
fibonacciCaller2
n
начинает увеличиваться, а steps
начинает уменьшаться?
Это, вероятно, из-за моего непонимания того, как работает Javascript, но я бы хотел получить хорошее объяснение по этому поводу.