C# 这种朴素的递归斐波那契实现如何避免堆栈溢出?

C# 这种朴素的递归斐波那契实现如何避免堆栈溢出?,c#,.net,algorithm,stack-overflow,fibonacci,C#,.net,Algorithm,Stack Overflow,Fibonacci,几个月前的一个笑话是,我的一位同事试图通过使用指数算法计算斐波那契数来“加速宇宙的热死亡”: int Fib(int n) { if (n <= 1) return 1; else return Fib(n - 1) + Fib(n - 2); } intfib(intn) { 如果(n递归调用不是同时计算的,而是按顺序计算的,这意味着Fib(n-2)将只在Fib(n-1)之后进行计算(或者反过来)。这意味着即使创建2^n递归调用,也只有n

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

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

如果(n递归调用不是同时计算的,而是按顺序计算的,这意味着
Fib(n-2)
将只在
Fib(n-1)
之后进行计算(或者反过来)。这意味着即使创建
2^n
递归调用,也只有
n
将在同一时间处于活动状态。因此
Fib(52)
只需要为
Fib
52
堆栈帧占用空间,而不占用任何明显的堆栈空间。

朴素的Fibonacci实现确实会生成大量函数调用(实际上等于结果),但它的递归不是很深。递归的最大深度是
n

那么,您认为在每次递归时有多少字节被推到堆栈中?您使用的是什么版本的C编译器和框架?您看过生成的MSIL或[de]吗编译后的汇编程序?完全有可能C#编译器将解析树识别为斐波那契序列并进行特殊情况的优化。2^52是我头脑中最天真的计算,呵呵,因为复杂性是O(2^n)。时间复杂性和空间复杂性不是一回事。程序是O(n)在堆栈空间中,以及在时间上的O(Fib(n))此外,您没有计算第52个fib数。第47个以上的fib数大于int.MaxValue。您悄悄溢出。+1.堆栈深度太小,无法解决任何问题。要从此类代码中获得邪恶的东西,应该并行开始计算(但堆栈深度仍然不是问题)。@AlexeiLevenkov提出了一种解决问题的方法“加速”就是产生一个新线程来并行计算每个fib(x)!哈哈