递归实现斐波那契数列的空间复杂度的讲解

时间:2024-04-25 09:26:44

题目:计算斐波那契数列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函数每次对栈空间的调用类型也是一致的,所以会进行栈空间的重复利用!