【发布时间】:2017-05-16 17:53:04
【问题描述】:
我无法理解这个简单的递归算法是如何返回值的。算法如下:
int fib(int n)
{
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
我想知道在这个函数中输入 5 是如何返回 5 的? 我知道第五个斐波那契数是 5,所以这是正确的答案,但我不确定这个答案是如何从上面的代码得出的.前五个斐波那契数:1 1 2 3 5。
根据我有限的理解,我认为将 5 传递给该函数会返回 7。这是因为 5-1 = 4 和 5 - 2 = 3。然后将这两个数字相加得到简单的整数 7。这有意义吗?我确信我已经失去了阅读这篇文章的人,尽管这很简单。如果我读到这篇文章,我会迷路的。
另外,如果我创建一个递归树并显示从 5 开始对 fib 的递归调用,我看不到它最终如何返回 5,但我确实看到了对函数 fib() 的所有调用,直到最终返回 1,因为fib() 的参数是 0 或 1。我绘制的递归树只是此 page 中所示的递归树的副本。
谁能帮我理解这个递归算法?
【问题讨论】:
-
如果您想了解递归,我将从一个更简单的示例开始。递归阶乘函数可能更容易理解。
-
它没有说
return (n-1) + (n-2);。它说return fib(n-1) + fib(n-2);。换句话说,n == 5是在做return fib(4) + fib(3);。 -
@FrançoisAndrieux - 但是什么是
fib(4)和fib(3),分解为递归调用? :-) -
你检查你的树节点的值了吗?总结一下:
fib(1) + fib(0) + fib(1) + fib(1) + fib(0) + fib(1) + fib(0) + fib(1)会变成= 5 -
如果我把树上所有的加起来,那么它实际上等于 5!哇!感谢您的评论。很有帮助...