Задать вопрос
@Neponyatlivy

Объясните мне на пальцах рекурсию Фибоначчи F(4, например). Это самый простой алгоритм, а я не могу понять. Что мне делать?

Я не знаю, что мне делать. Я просто не могу понять суть работы! Все кроме меня усвоили алгоритм, но я просто не понимаю. Само число чисто в голове или на бумаге могу вычислить, но вот в коде этот процесс путает.
Вроде бы сначала всё понятно, F(4) постепенно опускается до одного, результаты в стаке ждут, он возвращает 1. А что дальше происходит - я просто не пойму. Сначала n=2, затем n=0, потом снова n=2, и в этот момент я полностью теряюсь в отладчике.
Может быть есть какая-то схема визуальная?
int Fib( int n)
{
     if (n == 0) return n;
     if (n == 1) return n;

     return  Fib(n - 1) + Fib(n - 2);
     
}

 Console.WriteLine(Fib(4));
  • Вопрос задан
  • 603 просмотра
Подписаться 1 Простой Комментировать
Решение пользователя Сергей Соловьев К ответам на вопрос (5)
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Сначала n=2, затем n=0, потом снова n=2

Рекурсивные функции лучше визуализировать в виде дерева вызовов. В данном случае, это будет бинарное дерево, т.к. 1 функция (F(n)) может вызвать максимум 2 подфункции (F(n - 1) и F(n -2)).
Теперь самое интересное - представление в отладчике.
Вспомни, что функция заканчивается return F(n -1) + F(n - 2). Ответ на твой вопрос кроется здесь.
На самом деле эта конструкция разворачивается в нечто подобное:
int prev = F(n - 1);
int prevPrev = F(n - 2);
return prev + prevPrev;

На словах:
1. Ты вызываешь корневой F(2) - n = 2
2. Дебагер заходит в функцию и опускается до return F(n - 1) + F(n - 2)
3. Заходит в F(n - 1) - n = 1
4. Эта функция возвращает 1 - ты снова в родительской функции n = 2
5. Заходит в F(n - 2) - n = 0
6. Эта функция возвращает 1 - ты снова в родительской функции n = 2
7. Родительская (исходная) функция возвращает сумму - 1 + 1
Ответ написан