斐波那契数列递归 space 复杂度

Fibonacci sequence recursion space complexity

public int fib(int n) {
if (n == 0) return 0; 
if (n == 1) return 1; 
return fib(n-1) + fib(n-2);
}

我很困惑为什么上面代码的 space 复杂度是 O(n)。 现在,我知道递归的深度是n,也就是树的高度。

没有创建临时变量或最终结果变量。 space 这里的复杂度是从函数调用堆栈计算出来的吗?

是的,这种情况下的 space 复杂度取决于调用堆栈中使用的 space,这取决于活动函数调用的数量(已调用但未完成执行的函数)。

如果您观察到最后一条语句

return fib(n-1) + fib(n-2)

计算fib(n-1)时使用O(n)space。一旦 fib(n-1) 完成执行堆栈 space 可以被 fib(n-2) 重用。

因此,在这种情况下,任何时候调用 fib(n) 的活动堆栈帧数为 O(n),因此 space 复杂度为 O(n) .

值得注意的是,时间复杂度是指数级的。