递归的效率问题: 递归一定比迭代慢么?

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);
}
}
...全文
1699 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
metaphor 2004-11-04
  • 打赏
  • 举报
回复
在楼主的这个程序里迭代和递归的速度应该是一样的
因为它只是把一个循环调用变成了递归调用,没有像树那样展开去

但我看到其他迭代和递归作比较的时候情况不是这样的
在迭代的时候,函数只调用一次!在内部用堆栈实现递归的功能
这样用堆栈就减少了调用程序保护现场的开销。

meijing 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
  • 打赏
  • 举报
回复
这个不一定吧 我没有做过试验 也没有认真的研究过

把递归改为非递归 通常要自己建栈 所以 和功底有关把
不过通常认为 非递归要快些

33,027

社区成员

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

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