3.3.3 栈在递归中的应用

文章探讨了函数调用的过程,强调最后调用的函数反而最先执行结束的LIFO原则。递归算法虽然能解决复杂问题,但过度使用会导致空间复杂度增加和栈溢出风险,且存在重复计算问题。通过栈可以将递归转换为非递归以优化性能。
摘要由CSDN通过智能技术生成

辛苦手码不易, 如若有帮助烦请不吝收藏点赞 😃


先来看一下函数的调用过程:
在这里插入图片描述
不难看出, 最后被调用的函数反而是最先执行结束的(LIFO)–>栈

在上图右侧的栈中, 我们可以看到, 栈为每一个函数都分配了一个存储空间, main()中的实参a,b,c和func1中的a,b不是同一个数据

递归算法: 可以把原始问题转换成为 属性相同, 但 规模较小 的问题
在这里插入图片描述
右侧函数调用栈中, #后187表示返回地址(代码行号)

进入一层递归->入栈 结束一层递归->出栈

所以, 递归太多会增大程序的空间复杂度, 递归太多层也会导致函数调用栈的溢出
在这里插入图片描述
可以看到, Fib(0), Fib(1), Fib(2)都被计算了多次, 故递归调用有可能包含很多重复计算的缺点

简单总结:
在这里插入图片描述
利用栈将递归转换为非递归:这里参考了大佬的文章

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Autumn_begins

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值