【发布时间】:2018-11-08 17:07:12
【问题描述】:
只是一个斐波那契算法,我如何打印每一个斐波那契数列而不重复每一步?
递归函数在任何方面都有用吗?我知道它更清晰,但是如果我设置 n = 40,这个简单的算法会有明显的延迟,而迭代的方式是瞬时的。
int fib(int n)
{
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
return fib(n - 1) + fib(n - 2);
}
【问题讨论】:
-
也许这个问题和答案会对您非常相似的问题有所启发:stackoverflow.com/q/38215004/1212725
-
@bruceg 仍然不知道什么情况下递归是一个很好的用途,虽然那个帖子确实有帮助,谢谢。
-
一个朴素的递归解决方案必须计算一次
fib(40),但这意味着计算一次fib(39)和一次fib(38)。计算fib(39)意味着计算fib(38)和fib(37)— 因此将计算出两批fib(38)。当然,每一个也计算fib(37)和fib(36),所以fib(37)被计算了3次,而且……它很快就积累了很多递归函数调用,这就是为什么递归解决方案比迭代解决方案。否:(天真的)递归斐波那契数列是个坏主意。一个不那么天真的版本会在运行时存储值。 -
递归只有在学校才有用。在真正的编程中是无用的,一些标准完全禁止它,因为它非常危险且容易出错。它通常速度较慢并消耗大量资源(时间、堆栈空间等)
-
@JonathanLeffler 不那么天真的版本有优势,与迭代方式相同还是更差?