社区
数据结构与算法
帖子详情
递归的效率问题: 递归一定比迭代慢么?
meijing
2004-10-28 04:11:50
假设递归和非递归的算法分别如下, 迭代的效率会比递归高么? 为什么?
///////////////////////////////
// 迭代
f()
{
//do some work
}
for (int i = 0; i < 5; ++i)
{
f();
}
////////////////////
// 递归
f()
{
static int i = 5;
if (i > 0)
{
// do some work
f (--i);
}
}
...全文
1816
16
打赏
收藏
递归的效率问题: 递归一定比迭代慢么?
假设递归和非递归的算法分别如下, 迭代的效率会比递归高么? 为什么? /////////////////////////////// // 迭代 f() { //do some work } for (int i = 0; i 0) { // do some work f (--i); } }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
metaphor
2004-11-04
打赏
举报
回复
在楼主的这个程序里迭代和递归的速度应该是一样的
因为它只是把一个循环调用变成了递归调用,没有像树那样展开去
但我看到其他迭代和递归作比较的时候情况不是这样的
在迭代的时候,函数只调用一次!在内部用堆栈实现递归的功能
这样用堆栈就减少了调用程序保护现场的开销。
meijing
2004-11-04
打赏
举报
回复
谢谢各位,明天结帖
DiabloWalkOnTheEarth
2004-11-04
打赏
举报
回复
在PC中堆栈最大不能超过64k
-------------------------------------------------
好像不是,WIN32下缺省是1M,还可以设置的更大,唉,现在我写的程序只有4K堆栈,郁闷啊.
crybigbaby
2004-11-03
打赏
举报
回复
1
从表面看,两者效率一样,但是你没有考虑计算机内核的处理,这时递归的效率远不如迭代,如果调用次数一样的话,迭代应比递归节约50%以上
meijing
2004-11-03
打赏
举报
回复
crybigbaby(寻找快乐)
能否具体讲讲计算机内核的处理上二者有什么不同?
谢谢
meijing
2004-11-02
打赏
举报
回复
谢谢各位大侠指点。
看了大家的指点,我的理解如下,不知对否?
1。递归调用慢就是指的函数调用带来的参数压栈和退栈所带来的开销
2。对于我举的例子而言,虽然表面一个采用递归,另一个用迭代。但是二者都同样有五次函数调用。所以二者的效率应该大致差不多。
3。采用递归的话,要小心系统分配给该进程的堆栈溢出?
zzwu
2004-10-30
打赏
举报
回复
利用堆栈作递归,最大缺点在于容易产生堆栈溢出:在PC中堆栈最大不能超过64k
xiaoxiaofei
2004-10-29
打赏
举报
回复
规模小的问题用递归好一点,因为代码比较简单明了;规模大的问题最好不要用递归,毕竟一般的电脑内存不是无限的啊.
mathe
2004-10-29
打赏
举报
回复
对于好一点的编译器,这两种方法产生的代码是一样的
merelynobody
2004-10-29
打赏
举报
回复
第一个例子是迭代吗?
我认为迭代应该是这种形式
对于f(x)=g(f(x-1)),f(0)=a
迭代:
for(i=1;i<n;i++)
fx[i]=g(fx[i-1]);
递归:
double f(double x)
{
if(x==0)
return a;
return g(f(x-1));
}
fx=f(N-1);
迭代就是递推,和递归相反的过程
ZhangYv
2004-10-29
打赏
举报
回复
例子2的比例子1多传进一个参数。我试过一些手工模拟堆栈的试验,发现执行效率不如系统自己的堆栈,因为自己写出入栈的运算,效率肯定不如汇编的push, pop了,但是手工模拟堆栈有个好处是可以自己控制堆栈的深度,这样更加安全一些。
迭代是不断重复某一过程;
递归是利用上一层的调用的返回结果来参与本层计算。
所以从本质上来说还是有点不太一样的。
caohoujie
2004-10-29
打赏
举报
回复
递归慢。我写过一些程序,用递归很简洁,改为非递归后代码很庞大,但时间要快一倍。
nicememory
2004-10-29
打赏
举报
回复
递归调用慢就是指的函数调用带来的参数压栈和退栈所带来的开销
因为很多递归问题的非递归形式是可以全部放在同一个函数中进行的
这个不是很大的问题
unix 6 的putchar 就是采用递归实现的,很优雅,但是估计效率应该不高
再有就是递归深度的问题了,如果问题规模很大,递归函数所展开的栈有可能耗尽栈空间,一般一个进程的栈空间也就几兆的样子而已
meijing
2004-10-28
打赏
举报
回复
在我给的例子中,迭代的方法也调用5次f(),是不是也建5次栈?
这方面的东西该看什么书?
jaredcsdn
2004-10-28
打赏
举报
回复
一样的算法,要把迭代写得比递归慢当然没问题(写的垃圾点就行了)。
不过如果两者都好好写的话,应该是迭代快,毕竟递归需要重新建栈。
huhuhu5
2004-10-28
打赏
举报
回复
这个不一定吧 我没有做过试验 也没有认真的研究过
把递归改为非递归 通常要自己建栈 所以 和功底有关把
不过通常认为 非递归要快些
迭代
和
递归
的理解和区别
最近做一些题经常会碰到
迭代
的方法解的,或者
递归
解法,容易搞混,特在此整理一下 一.
递归
: 由例子引出,先看看
递归
的经典案例都有哪些 1.斐波那契数列 斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、…… 这个数列从第三项开始,每一项都等于前两项之和。 2. 阶乘 n! = n * (n-1) * (n-2) * …* 1(n>0) 3.汉诺塔问...
迭代
与
递归
的区别
迭代
和
递归
的区别: 从“编程之美”的角度看,可以借用一句非常经典的话:“
迭代
是人,
递归
是神!”来从宏观上对二者进行把握。
递归
:重复调用函数自身实现循环称为
递归
;
递归
实际上不断地深层调用函数,直到函数有返回才会逐层的返回,
递归
是用栈机制实现的,每深入一层,都要占去一块栈数据区域,因此,
递归
涉及到运行时的堆栈开销(参数必须压入堆栈保存,直到该层函数调用返回为止),所以有可能导致堆...
教你领悟函数
递归
的本质
教你领悟函数
递归
的本质
函数
递归
和
迭代
在C语言中
递归
就是看一下简单函数的
递归
:上面的代码实现演示一下函数的
递归
,最终是会陷入死循环的,栈溢出。
C语言函数
递归
的详解
递归
其实是一种解决
问题
的方法,在C语言中,
递归
就是函数自己调用自己,它通常把一个大型复杂的
问题
层层转化为一个与原
问题
相似,但规模较小的子
问题
来求解,直到子
问题
不能再被拆分,
递归
也就结束了
递归
的主要思考方式在于:把大事化小
递归
的递是递推的意思,归是回归的意思int main()main();//main函数中又调用了main函数return 0;上述就是一个简单的
递归
程序,只不过上面的
递归
只是为了演示
递归
的基本形式,不是为了解决
问题
,代码最终也会陷入死循环,导致栈溢出。
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章