Fibonacci序列递归空间复杂度

时间:2018-06-05 14:19:32

标签: algorithm 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);
}

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

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

1 个答案:

答案 0 :(得分:2)

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

如果你观察到最后一个陈述

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

计算fib(n-1)O(n)使用空格。 fib(n-1)完成执行后,fib(n-2)可以重复使用堆栈空间。

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

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