Я должен кое-что понять. Кажется, что нет хорошего руководства для объяснения явно. Как выглядит дерево функций?Объяснение по рекурсии Фибоначчи
static long Fib(int n)
{
if (n <= 2)
{
return 1;
}
return Fib(n - 1) + Fib(n - 2);
}
Предполагая, что я Fib(7)
, я на самом деле понимаю, что это должно выглядеть следующим образом:
Дело в том, что кажется, что дерево, как если fib(7)
на самом деле означает fib(6)
+ fib(5)
что должно быть правдой ... Однако, если я понимаю рекурсию, чем fib(7)
на самом деле fib(6)
+ fib(5)
, но fib(5)
еще не сдан с fib(6)
теперь называет себя fib(4)
+ fib(3)
и еще раз fib(3)
не будет выполнен, так как fib(4)
будет называть себя до тех пор, пока он не остановится в состоянии «остановки» ... и чем?
Если fib(7)
звонки fib(6)
и так далее ..... до fib(1)
, чем обо всех остальных fib(n-2)
функций?
Как он на самом деле возвращает каждый раз результат и говорит мне, что такое значение fib(7)
?
Просто думать о каждом вызове в качестве отдельного экземпляра метода. Fib (с параметром 7) создает еще один экземпляр Fib (с параметром 6), а затем ждет, пока он вернет значение. Затем он создает еще один экземпляр Fib (с параметром 5), затем ждет, пока он вернет значение. Затем он добавляет 2 значения. –
выполняется с помощью стека. каждый метод, который вы вызываете, будет храниться в стеке со всей необходимой информацией для выполнения всей работы и продолжения работы. поэтому, когда вы вызываете 'f (6)', он будет добавлен вверху стека, а 'f (7)' находится под 'f (6)'. после окончания 'f (6)' он удалит 'f (6)' из стека, и теперь вы можете продолжить в 'f (7)', потому что у вас есть вся необходимая информация, хранящаяся в стеке, чтобы продолжить ... –
Сторона примечания: это очень неэффективный способ вычисления числа Фибоначчи. (экспоненциальное время) –