社区
数据结构与算法
帖子详情
递归为什么会消耗很多资源
aioros9520
2009-08-05 03:26:24
请问用递归为什么会消耗很多资源?
从时间和空间上分析下这是为什么?
...全文
1626
19
打赏
收藏
递归为什么会消耗很多资源
请问用递归为什么会消耗很多资源? 从时间和空间上分析下这是为什么?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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语言】
递归
的内存占用过程
递归
虽然简单优雅,但需要仔细处理内存占用和
递归
深度问题,特别是在
资源
受限的嵌入式系统中需要特别注意内存空间的使用情况。在C语言中,
递归
的实现
会
占用内存栈(Call Stack),每次
递归
调用都
会
在栈上分配一个新的。那么,在
递归
的过程中到底发生了什么事情呢?以下将通过文字解析和图示说明
递归
对内存的占用情况,让大家直观的看见
递归
的过程。
递归
调用时,每次调用都
会
创建一个新的栈帧,压入到内存栈中。
递归
结束时,函数逐层返回,栈帧依次弹出释放。运行上述程序
会
导致栈溢出,因为
递归
调用的栈帧无限增长,超过了栈的容量。
第七章 C语言函数_
递归
函数的致命缺陷:巨大的时间开销和内存开销(附带优化方案)
递归
函数是一种强有力的技巧,用来解决某些问题很顺手,比如前面提到的求阶乘、求菲波那契数;但是和其他技巧一样,
递归
函数也是有缺陷的,而且这种缺陷是致命性的。
递归
函数的空间开销 在程序占用的整个内存中,有一块内存区域叫做栈(Stack),它是专门用来给函数分配内存的,每次调用函数,都
会
将相关数据压入栈中,包括局部变量、局部数组、形参、寄存器、冗余数据等。 栈是针对线程来说的,每个线程都拥有一个栈,如果一个程序包含了多个线程,那么它就拥有多个栈。目前我们编写的程序都是单线程的,所以不必考虑多线程的情况。
递归
的优缺点
循环 代码可读性不如
递归
但是效率更高 优点: 1. 简洁 2.在树的前序,中序,后序遍历算法中,
递归
的实现明显要比循环简单得多。
递归
算法的代码很简洁。但同时也存在缺点
递归
太深的话,
资源
不够, 或者直接栈溢出; 系统在每次
递归
前都要保护现场,
资源
占用比其他调用高
很多
; 可读性可能很好, 可能很差, 差到不得不debug才能看清逻辑; ...
递归
函数详解
一.概念: **
递归
就是一个函数在它的函数体内调用它自身。**执行
递归
函数将反复调用其自身,每调用一次就进入新的一层。
递归
函数必须有结束条件。 当函数在一直递推,直到遇到
递归
临界点返回,这个墙就是结束条件。 所以
递归
要有两个要素,结束条件与递推关系 二.举例: 例1: 结果: 例2: 结果: 三.注意事项: 1.
递归
函数能实现的for循环都能实现; 2.
递归
函数非常占用内存,没调用一次自身,就
会
占用一块内存存储这个函数块; 3.
递归
函数有最大
递归
次数,因为第二点,python自身的保护机制,避免内存
用python和HY(lisp)代码为例学习什么是
递归
?
递归
就是行为规则,是一种处理过程,
递归
也是最符合人类原生行为的编程方法,所以即使很复杂的问题,也比较容易用
递归
来实现算法。比如汉诺塔,使用
递归
代码非常简洁,使用循环则代码复杂
很多
。关于
递归
的
资源
消耗
,确实要比普通函数多,不过
很多
编译器专门对
递归
进行了优化,许多Common Lisp 编译器(比如sbcl)都可以把尾
递归
转化成循环函数,这样就没有额外的
资源
消耗
了。再回过头来看看ANSI Common Lisp关于
递归
的描述,加强一下记忆起初,许多人觉得
递归
函数很难理解。
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章