辛苦手码不易, 如若有帮助烦请不吝收藏点赞 😃
先来看一下函数的调用过程:
不难看出, 最后被调用的函数反而是最先执行结束的(LIFO)–>栈
在上图右侧的栈中, 我们可以看到, 栈为每一个函数都分配了一个存储空间, main()中的实参a,b,c和func1中的a,b不是同一个数据
递归算法: 可以把原始问题转换成为 属性相同, 但 规模较小 的问题
右侧函数调用栈中, #后187表示返回地址(代码行号)
进入一层递归->入栈 结束一层递归->出栈
所以, 递归太多会增大程序的空间复杂度, 递归太多层也会导致函数调用栈的溢出
可以看到, Fib(0), Fib(1), Fib(2)都被计算了多次, 故递归调用有可能包含很多重复计算的缺点
简单总结:
利用栈将递归转换为非递归:这里参考了大佬的文章