社区
数据结构与算法
帖子详情
递归为什么会消耗很多资源
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
打赏
举报
回复
函数调用会不停地使用栈,报存现场,恢复现场~ 空间时间上当然消耗得多啦
猫已经找不回了
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语言函数_
递归
函数的致命缺陷:巨大的时间开销和内存开销(附带优化方案)
递归
函数是一种强有力的技巧,用来解决某些问题很顺手,比如前面提到的求阶乘、求菲波那契数;但是和其他技巧一样,
递归
函数也是有缺陷的,而且这种缺陷是致命性的。
递归
函数的空间开销 在程序占用的整个内存中,有一块内存区域叫做栈(Stack),它是专门用来给函数分配内存的,每次调用函数,都
会
将相关数据压入栈中,包括局部变量、局部数组、形参、寄存器、冗余数据等。 栈是针对线程来说的,每个线程都拥有一个栈,如果一个程序包含了多个线程,那么它就拥有多个栈。目前我们编写的程序都是单线程的,所以不必考虑多线程的情况。
递归
的优缺点
循环 代码可读性不如
递归
但是效率更高 优点: 1. 简洁 2.在树的前序,中序,后序遍历算法中,
递归
的实现明显要比循环简单得多。
递归
算法的代码很简洁。但同时也存在缺点
递归
太深的话,
资源
不够, 或者直接栈溢出; 系统在每次
递归
前都要保护现场,
资源
占用比其他调用高
很多
; 可读性可能很好, 可能很差, 差到不得不debug才能看清逻辑; ...
递归
函数详解
一.概念: **
递归
就是一个函数在它的函数体内调用它自身。**执行
递归
函数将反复调用其自身,每调用一次就进入新的一层。
递归
函数必须有结束条件。 当函数在一直递推,直到遇到
递归
临界点返回,这个墙就是结束条件。 所以
递归
要有两个要素,结束条件与递推关系 二.举例: 例1: 结果: 例2: 结果: 三.注意事项: 1.
递归
函数能实现的for循环都能实现; 2.
递归
函数非常占用内存,没调用一次自身,就
会
占用一块内存存储这个函数块; 3.
递归
函数有最大
递归
次数,因为第二点,python自身的保护机制,避免内存
排序 - 快速排序(非
递归
实现)C++
前言: 为什么要实现快排非
递归
算法,不是已经有了
递归
算法了吗? 计算机在实现
递归
时
会
调用系统的堆栈,这很
消耗
计算机内存
资源
,所以采用非
递归
算法的本质就是手动模拟系统的堆栈调用来降低computer
资源
的
消耗
。 快排的详细讲解和
递归
算法的入口:https://blog.csdn.net/y_16041527/article/details/80460015 话不多讲,直接看代码(有注释...
递归
的本质原理
递归
算法的概念
递归
(Recursion)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。
递归
式方法可以被用于解决
很多
的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行
递归
。 关于
递归
算法 在日常开发中,我们使用循环语句远远大于
递归
,但这不能说明递...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章