【问题标题】:Fibonacci sequence recursion space complexity [duplicate]斐波那契数列递归空间复杂度
【发布时间】:2018-06-05 14:19:32
【问题描述】:
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,也就是树的高度。
没有创建临时变量或最终结果变量。这里的空间复杂度是根据函数调用栈计算的吗?
【问题讨论】:
标签:
algorithm
recursion
space-complexity
【解决方案1】:
是的,这种情况下的空间复杂度取决于调用堆栈中使用的空间,这取决于活动函数调用的数量(函数调用但未完成执行)。
如果你观察最后一条语句
return fib(n-1) + fib(n-2)
在计算fib(n-1) 时,使用O(n) 空间。一旦fib(n-1) 完成执行堆栈空间就可以被fib(n-2) 重用。
因此,在这种情况下,任何时候调用fib(n) 的活动堆栈帧数为O(n),因此空间复杂度为O(n)。
值得注意的是,时间复杂度是指数级的。