题目:计算斐波那契数列Fib的空间复杂度
过程图解:
理解要点:
递归的运算顺序和方式不是同时进行图中的所有Fib函数,而是有顺序的!
第一步:单独的一个Fib(N)进行到底Fib(2)和fib(1)
第二步:Fib(2)达到了if的限制条件,然后回到了上一步Fib(3),此时Fib(2)的栈空间退还给操作系统!
第三步:Fib(3)此时再去调用另一部分Fib(1)(第3步),此时的Fib(1)会使用之前Fib(2)的栈空间,而不是额外的新的栈空间,然后Fib(1)达到了if的限制条件,然后回到了Fib(3)(第4步)
第四步: 此时的Fib(3)完全执行完毕,和最下面的Fib(2)执行完毕一样,此时执行完毕的Fib(3)会返回到上一级的Fib(4)(第5步),然后Fib(4)开始执行另一部分Fib(2)(第6步),然后Fib(2)执行完毕返回到上一级的Fib(4)(第7步)
综上所述:空间是可以重复利用的!
该递归过程中,并不是同时额外的执行的所有的Fib函数,也就是 不是每一个Fib函数都能够同时拥有自己的栈空间,而是按照如图所示的步骤而来,所以 :
到左下的Fib(2)的时候,此时不同的Fib栈空间个数达到了最大,也就是n个栈空间,然后就会往回递归,并且往回递归的过程中还是重复利用之前的栈空间,所以空间复杂度应该是O(N)!
对于栈空间的重复利用的证明:
代码:
堆栈的变化:
↓
↓
另一个证明栈空间重复利用的例子:
因为两次调用栈空间的类型一致,所以进行了栈空间的重复利用,正如Fib函数每次对栈空间的调用类型也是一致的,所以会进行栈空间的重复利用!