Это один из тех случаев, когда полезно подумать о том, как компьютер это делает.
Давайте начнем с функции. Я напишу его в псевдокоде со вкусом Python, потому что хочу, чтобы вы на секунду перестали думать о ЯЗЫКЕ.
def fib(n):
if n == 0: return 0
if n == 1: return 1
if n > 1: return fib(n-2) + fib(n-1)
Теперь давайте рассмотрим это для fib (2)
fib(2)
имеет n> 1 , поэтому требуется третья ветвь,
return fib(2-2) + fib(2-1)
поэтому он вызывает fib () с 0, что равно 0
return 0 + fib(2-1)
звонки fib () с 1
return 0 + 1
и мы видим результат 1. Теперь рассмотрим fib (3):
n> 1, поэтому
return fib(3-2)+fib(3-1)
и поскольку 3-2 равно 1, мы получаем fib (1) для первого члена, который равен 1:
return 1 + fib(3-1)
и теперь, когда мы вызываем fib (3-1), то есть fib (2), у нас пока нет прямого ответа; п> 1. Так становится
return 1 +
return fib(2-2) + fib(2-1)
, который становится
return 0 + 1
и мы возвращаемся к предыдущему звонку
return 1 + 1
и получите значение 2. Итак, вы видите, что нет отдельного потока, он просто работает через выражение. Я оставлю это в качестве упражнения, чтобы разработать пример для fib (4); Бьюсь об заклад, если вы это сделаете, однако, вы будете иметь это прибито.
Pop quiz: почему итеративная версия настолько значительно эффективнее?