社区
数据结构与算法
帖子详情
递归为什么会消耗很多资源
aioros9520
2009-08-05 03:26:24
请问用递归为什么会消耗很多资源?
从时间和空间上分析下这是为什么?
...全文
1718
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,这样再从内存中取出刚才存的表达式,得出最终的结果。
这样的话,会花销更大的系统资源。
不知道这样说,你明白不?
递归
的缺点,如何解决
递归
的缺点:
递归
太深容易造成堆栈的溢出。 帖子一: 如何解决
递归
调用的栈空间不足 推荐答案 这个跟C++关系不是太大,跟系统和开发环境有关. 并且这个栈的大小,也是可以调节的 做好不要在函数内部定义很大的数组. 也不能让程序出现无限递
为什么你的协程持续
消耗
内存?一文看懂
资源
释放底层原理
掌握纤维协程的
资源
释放技巧,有效解决协程内存泄漏问题。深入解析其底层原理,涵盖常见应用场景与高效管理方法,提升程序性能与稳定性。理解协程生命周期管理的关键优势,值得收藏。
函数
递归
调用详解
递归
问题是一个说简单也简单,说难也有点难理解的问题.我想非常有必要对其做一个总结. 首先理解一下
递归
的定义,
递归
就是直接或间接的调用自身.而至于什么时候要用到
递归
,
递归
和非
递归
又有那些区别?又是一个不太容易掌握的问题,更难的是对于
递归
调用的理解.下面我们就从程序+图形的角度对
递归
做一个全面的阐述. 我们从常见到的
递归
问题开始: 1 阶乘函数 #include using names
递归
消耗
完内存_
递归
生成器,以及如何不
消耗
它们的所有内存
递归
消耗
完内存A short while back I wrote a post touching upon combinatorics. Part of the code of that article used a Combinator object, which generated combinations of choices and stored them in an array. 不久...
递归
与递推的区别
刚才在IBM DW上看到这篇《JavaScript 技巧与高级特性》,其中关于arguments.callee的部分有一个用
递归
来求斐波那契数列的例子,简化一下是这样的: //经典
递归
function fibonacci(n) { return (function(n) { if (n == 1 || n == 2) return 1; return arguments.ca
数据结构与算法
33,026
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章