社区
数据结构与算法
帖子详情
递归为什么会消耗很多资源
aioros9520
2009-08-05 03:26:24
请问用递归为什么会消耗很多资源?
从时间和空间上分析下这是为什么?
...全文
1713
19
打赏
收藏
递归为什么会消耗很多资源
请问用递归为什么会消耗很多资源? 从时间和空间上分析下这是为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
arong1234
2009-08-10
打赏
举报
回复
其实压栈、出栈所占用的cpu和内存都不多。如果一个递归函数自己很复杂,压栈、退栈所使用的CPU时间几乎是可以忽略的,而占用的内存其实最多一般也不超过1M
出现问题的原因是:栈的空间只有1M,不可以动态增加
[Quote=引用 17 楼 kefeng2008 的回复:]
需要许多次的压栈,退栈,占用许多内存和CPU资源
[/Quote]
leizhe
2009-08-10
打赏
举报
回复
函数调用 就是 压栈 退栈操作
先将调用函数的地址压栈
分配被调用函数 局部变量分配 形参 返回值 都要分配 调用后一层一层返回
递归自己调用自己多少次 就要分配多少次 局部变量分配 形参 返回值
unwritewolf
2009-08-09
打赏
举报
回复
递归调用,程序将临时变量和函数入口地址保存入线程堆栈,递归返回时从堆栈返回,消耗系统资源,xp系统默认的线程堆栈好像是1MB,如果递归次数太多,会导致堆栈溢出。
warren258
2009-08-09
打赏
举报
回复
[Quote=引用 11 楼 gamedragon 的回复:]
递归消耗的资源并不比迭代大很多,但是会大大简化代码的可读性。
是否用递归只有适不适合的问题,东西并不适合递归,比如说1楼的例子。
[/Quote]
有道理。不用递归的时候就不要用嘛,何必呢
kefeng2008
2009-08-09
打赏
举报
回复
需要许多次的压栈,退栈,占用许多内存和CPU资源
gamedragon
2009-08-09
打赏
举报
回复
递归消耗的资源并不比迭代大很多,但是会大大简化代码的可读性。
是否用递归只有适不适合的问题,东西并不适合递归,比如说1楼的例子。
FancyMouse
2009-08-09
打赏
举报
回复
>如果用递归,时间大到无法忍受的地步。
这是算法问题不是递归的问题
arong1234
2009-08-09
打赏
举报
回复
还是学“数据结构”学成定式了,什么都要用从时间和空间上分析:)
递归本身不一定比普通方法使用更多资源,但是它使用的资源“堆栈”是非常有限的,因此它导致的问题尤其严重。
递归如果说使用更多资源的话,最大的问题在于如果不是递归,很多东西是重用的,而如果递归,每层函数都定义一套变量,不可能重用
以阶乘而言
int f(int n)
{
int result =1;
while(n >0){
result = result * n; n --;
};
return result;
}
如果递归
int f(int n)
{
int result;
if(n>1) {
result = f(n-1)*n
}else{
result =1;
};
}
这里变量result每进一次调用,都要重新定义一次,当然空间占用就多了(这里只是为了举例,实际result变量在这里是不需要定义的)
[Quote=引用楼主 aioros9520 的回复:]
请问用递归为什么会消耗很多资源?
从时间和空间上分析下这是为什么?
[/Quote]
yuguiyuanzouxiaoyu
2009-08-09
打赏
举报
回复
递归里面,函数调用的轨迹都是放在栈上,若递归层次太多的话,很有可能栈还会溢出,一般系统都限制了栈的大小。并且压入弹出、恢复现场一大堆的,太麻烦了。递归就是逻辑上直观些容易理解点。不过有的还是想不明哈,呵呵。
df274119386
2009-08-09
打赏
举报
回复
栈用多了,效率就低了
KingWolfOfSky
2009-08-06
打赏
举报
回复
刚学汇编,从那个方面理解可能是:
每次调用自身都要将相关数据要全部压栈保存起来以防止丢失。。。
超级大笨狼
2009-08-06
打赏
举报
回复
建议看Weiss的书,里边有一个菲波纳切的例子,如果用递归,时间大到无法忍受的地步。
zb_fly
2009-08-06
打赏
举报
回复
时间上,递归会不停的进行函数调用,空间上,函数的返回值,以及函数调用相关寄存器变量要进行保存。
jlp999
2009-08-06
打赏
举报
回复
递归未必效率低;
递归的问题是:每次递归函数参数压栈,递归太深,会使栈溢出;(函数栈很小,具体多小不知道)
解决办法是使用 尾递归。
ailyanlu
2009-08-06
打赏
举报
回复
函数调用会不停地使用栈,报存现场,恢复现场~ 空间时间上当然消耗得多啦
猫已经找不回了
2009-08-06
打赏
举报
回复
你想象一下可能会for。
wisdom_man
2009-08-06
打赏
举报
回复
主要是 函数递归调用过程中,
函数中的参数,返回值等会不停的压栈。
LeonTown
2009-08-05
打赏
举报
回复
而且系统会设置最大递归深度。
大于该深度时,就报错退出。
sailortobeno1
2009-08-05
打赏
举报
回复
因为递归的原理是:先将要计算的变量值存到堆栈中,依次循环,直到递归结束条件满足时,才从堆栈中取出要计算的变量值,计算得到最终结果。
打个比喻:要计算 10!=
递归的话,过程:10!=10 * 9!
9!=9 * 8!
……
2!=2 *1!
1!=1
计算时,它是将一个一个表达式存到内存,直到递归条件满足1!=1,这样再从内存中取出刚才存的表达式,得出最终的结果。
这样的话,会花销更大的系统资源。
不知道这样说,你明白不?
递归
的缺点,如何解决
本文对比分析了
递归
与迭代的优缺点,并提供了两者之间的转换实例。
递归
简洁易懂但
资源
消耗
大,可能导致栈溢出;迭代则相对高效稳定但逻辑较为复杂。通过具体示例说明了
递归
和迭代在不同场景下的应用。
为什么你的协程持续
消耗
内存?一文看懂
资源
释放底层原理
本文深入探讨协程持续
消耗
内存的原因,解析协程无法自动回收的根本机制,涵盖Go与Kotlin中协程生命周期管理差异,Context控制、defer
资源
释放、调度器行为及GC协同。通过实例分析常见泄漏场景,并提供基于上下文取消、超时控制和中间件统一管理的工程化解决方案,帮助构建高效稳定的协程系统。
递归
消耗
完内存_
递归
生成器,以及如何不
消耗
它们的所有内存
本文探讨了如何将
递归
算法转化为生成器,以避免在组合操作中因数组存储过多组合而导致的内存耗尽问题。通过逐步实验,从最初的简单尝试到最终采用yield*语法,实现了高效的一次一个组合的生成。
函数
递归
调用详解
本文深入探讨了
递归
的概念,通过阶乘函数、斐波那契数列以及两个不同输出的
递归
函数示例解释了
递归
调用的过程。
递归
虽易读但
资源
消耗
大,需谨慎使用。了解
递归
调用的规律和适用条件,有助于在编程实践中做出合理选择。
递归
与递推的区别
本文深入探讨了
递归
与迭代的区别及其在JavaScript中的应用。通过斐波那契数列的实例,对比了经典
递归
与尾
递归
的不同,并讨论了
递归
过程与迭代过程在
资源
消耗
和效率方面的差异。
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章