递归如何获取以前的值?
How does recursion get previous values?
我正在学习 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)
(。这就是为什么我们通常不递归实现斐波那契,除了研究递归。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 具有默认值的引用获取函数
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 读取、读取、获取和获取行之间有什么区别?