递归为什么会消耗很多资源

aioros9520 2009-08-05 03:26:24
请问用递归为什么会消耗很多资源?
从时间和空间上分析下这是为什么?
...全文
1458 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
  • 打赏
  • 举报
回复
函数调用会不停地使用栈,报存现场,恢复现场~ 空间时间上当然消耗得多啦
  • 打赏
  • 举报
回复
你想象一下可能会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,这样再从内存中取出刚才存的表达式,得出最终的结果。
这样的话,会花销更大的系统资源。

不知道这样说,你明白不?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧