c# – 这个天真的递归fibonacci实现如何不是stackoverflow?

几个月前,作为一个笑话,我的一位同事试图通过使用这种指数算法计算斐波纳契数来“加速宇宙的热死”:

int Fib(int n)
{
    if (n <= 1)
        return 1;
    else
        return Fib(n - 1) + Fib(n - 2);
}

这怎么不会导致C#中的stackoverflow?我们设法在放弃之前得到了Fib(52)(而Fib(51)花了很多时间).我认为这会严重破坏堆栈以导致堆栈溢出,因为CLR默认只将1M分配给堆栈.另外,我很确定这也不适合尾递归.

最佳答案
递归调用不是同时计算的,而是顺序计算的,这意味着Fib(n – 2)将仅在Fib(n – 1)之后(或相反的方式)计算.这意味着即使您创建2 ^ n个递归调用,也只有n同时处于活动状态.因此,Fib(52)将仅需要空间用于52个Fib的堆栈帧,其不占用任何显着的堆栈空间.

转载注明原文:c# – 这个天真的递归fibonacci实现如何不是stackoverflow? - 代码日志