递归如何获取以前的值?

How does recursion get previous values?

本文关键字:获取 何获取 递归      更新时间:2023-10-16

我正在学习 c++ 的基础,并遇到了一个我不理解的递归示例。该等式适用于斐波那契数,如下所示:

int fibo(int f)
{
if (f < 3)
{
return 1;
}
else
{
return fibo(f - 2) + fibo(f - 1);
}
}

"else"语句如何工作?我知道它添加了前两个数字来获得当前的 fibbonacci 数字,但是在没有任何先验信息的情况下,它怎么知道从哪里开始?如果我想要第 7 个斐波那契数,它怎么知道第 6 和第 5 个数字是什么?

在这个给定的等式中,它将在根中更深入。当您最初给出值 7 时,它将转到函数本身以获得值 7-2 = 5 和 7-1=6,但它仍然没有值 5 和 6。因此,它将进一步将值 5 减少到 3 和 4 以及 6 到 5 和 4。 最后,当 f 小于 3 时,它将返回值 1。在获取根值后,它将汇总这些值以获得总答案。

递归函数将根据需要多次调用自己来计算最终值。例如,如果您调用fibo(3),它将使用fibo(2)fibo(1)调用自身。

如果你写下一棵代表所有函数调用的树(括号中的数字是返回值(,你可以更好地理解它:

fibo(3) [1+1]
|
.--------------.
|              |
fibo(2) [1]    fibo(1) [1]

对于fibo(7),您将具有如下的多个调用:

fibo(7) [fibo(6) + fibo(5)]
|
.-----------------------------------------------.
|                                               |
fibo(6) [fibo(5) + fibo(4)]                      fibo(5) [fibo(4) + fibo(3)]
|                                               |
.---------------------------------.                     ...
|                                 | 
fibo(5) [fibo(4) + fibo(3)]        fibo(4) [fibo(3) + fibo(2)]
|                                 |
...                               ... 

每个递归调用将执行相同的代码,但具有不同的值f。每个递归调用都必须调用自己的子案例"版本"(较小的值(。这种情况一直持续到每个人都达到基本情况(f < 3(。

我没有画整棵树。但我想你可以看到它增长得非常快。有很多重复(fibo(7)调用fibo(6)fibo(5(,然后fibo(6)再次调用fibo(5)(。这就是为什么我们通常不递归实现斐波那契,除了研究递归。