递归和非递归(用栈)哪个效率更高?

runtospring 2009-04-11 09:25:24
1、递归和非递归(例如自己用栈实现八皇后问题)哪个效率更高?Google了一下,没有满意答案

2、不同的编译器编译相同的一段代码(指简单的、类似八皇后问题、迷宫问题这样的程序),是不是生成的.exe文件大小、效率也不同?
之前,我曾经把我的C++课程设计的代码(很垃圾的程序)放在vc++2008和Code::Block里分别生成.exe文件,运行时所占内存VC的要大,效率没法测试。

以上两个问题望高手解答~~感激不尽
...全文
4146 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
lauhonyeung 2011-02-04
  • 打赏
  • 举报
回复
19楼是明白人,剩下的,大部分都是不懂装懂
YcdoiT 2010-11-01
  • 打赏
  • 举报
回复
上面那个程序是用来解决“整数划分问题”的经典算法。
YcdoiT 2010-11-01
  • 打赏
  • 举报
回复
我很确定 如果是用栈机械的模拟 那么非递归完全不如递归 差好几倍吧。。
我写的代码如下:
#include<iostream>
#include<stack>
#include<ctime>
using namespace std;

//---------------------------递归算法
int q(int n,int m)
{
if((n<1) || (m<0)) return 0;
if((n==1) ||(m==1)) return 1;
if(n<m) return q(n,n);
if(n==m)
return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
int q(int num)
{
return q(num,num);
}

struct Point
{
int n,m;
Point(int _n,int _m){ n=_n; m=_m;}
};



//-------------------------非递归算法
int _q(int n,int m)
{
int sum=0;


Point tmp(n,m);
stack<Point> s;
s.push (tmp);
while(!s.empty())
{
tmp=s.top();
n=tmp.n; m=tmp.m;
s.pop();
if((n<1) || (m<0)) ++sum;
else if((n==1) ||(m==1)) ++sum;
else if(n<m) s.push(Point(n,n));
else if(n==m) { ++sum; s.push(Point(n,m-1)); }
else { s.push(Point(n,m-1)); s.push(Point(n-m,m)); }
}
return sum;
}
int _q(int num)
{
return _q(num,num);
}

int main()
{
int num;
unsigned int p;
do{
cout<<"Input a num:";
cin>>num;
p=clock();
cout<<" 递归: "<<q(num)<<endl;
cout<<"\t\t用时:"<<clock()-p<<endl;

p=clock();
cout<<"非递归: "<<_q(num)<<endl;
cout<<"\t\t用时:"<<clock()-p<<endl<<endl;

}while(num);

return 0;
}


CrescentS 2010-05-18
  • 打赏
  • 举报
回复
楼上的各位说法各异啊,有人能详细解释下么...
lx_616_at_yeah_net 2009-09-09
  • 打赏
  • 举报
回复
是的,在用栈的情况下 非递归确实不如递归 ...

^-^ ,你是第一个看法和我相同的人
ghostzitee 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yashuwa0622 的回复:]
递归优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多

关于编译器,其实都大同小异,可能在侧重点方面有点点区别而已
[/Quote]
我用Java测试了一下(一千万个整数快速排序) 在用栈的情况下 非递归确实不如递归 ...
love514425 2009-04-13
  • 打赏
  • 举报
回复
> 当然是非递归的效率要高。
> 递归在执行的时候要开辟很多栈空间来使之运行。

一般用迭代(非递归)代替递归,但是代码可读性相对来说差一点而已!
yashuwa0622 2009-04-13
  • 打赏
  • 举报
回复
递归优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多

关于编译器,其实都大同小异,可能在侧重点方面有点点区别而已
lx_616_at_yeah_net 2009-04-13
  • 打赏
  • 举报
回复
1、递归和非递归(用栈)

非递归(用栈),也用到栈函数了,和递归就没多大区别了!

每次递归进栈出栈,非递归(用栈)的每次调用栈函数也是进栈出栈。
主要是在非递归(用栈)中,它的栈函数里比递归多了些赋值语句。。。
所以效率上,非递归(用栈)比递归差。

只不过,递归越深,占用栈空间越多。非递归(用栈),占用的栈空间少。
如果,递归的深度还没达到超出栈空间的程度,那么递归比非递归(用栈)好。

如果是非递归(不用栈),当然是非递归最好。

2、个人感觉,大多数的编译器优化手法,基本上大同小异,区别不大。

VC编译的Debug版本和Release版本里,Debug版本的程序生成会比较大。(说的是VC6.0,还没用过vc++2008)

z0203153008 2009-04-13
  • 打赏
  • 举报
回复
受教了
beyond071 2009-04-13
  • 打赏
  • 举报
回复
继续学习
taoyanxu1989 2009-04-13
  • 打赏
  • 举报
回复
学习了
xiaocha 2009-04-13
  • 打赏
  • 举报
回复
1、递归和非递归(例如自己用栈实现八皇后问题)哪个效率更高?Google了一下,没有满意答案

递归有一种特殊情况,叫尾递归,编译器可以很好的优化,与非递归没有区别
一般的递归,增加了调用的时间,效率稍差,但差别不像想象中的那么大,小程序可以忽略不计

2、不同的编译器编译相同的一段代码(指简单的、类似八皇后问题、迷宫问题这样的程序),是不是生成的.exe文件大小、效率也不同?

根据编译器不同,效率稍有区别,但基本相当,区别不大
cccll9 2009-04-12
  • 打赏
  • 举报
回复
关于递归与非递归的效率,空间复杂度的话,非递归完胜。时间复杂度要具体问题具体分析,一般来说递归的执行步数较多,非递归的执行频率较多。
yangch_nhcmo 2009-04-12
  • 打赏
  • 举报
回复
非递归效率高
runtospring 2009-04-12
  • 打赏
  • 举报
回复
顶起~还有哪位同学可以回答一下这个问题?
runtospring 2009-04-11
  • 打赏
  • 举报
回复
"性能和效率上,递归最先出局~~ "
性能和效率上,非递归最先出局~~

gao125210 2009-04-11
  • 打赏
  • 举报
回复
递归比迭代效率低,一般用递推代替递归,当然递归可读性强2跟编译器有关
SimonYeung 2009-04-11
  • 打赏
  • 举报
回复
非递归效率高;递归代码写出来思路清晰,可读性强。
恩 是这样的 循环比递归的效率高
  • 打赏
  • 举报
回复
性能和效率上,递归最先出局~~
但递代码如5楼说的~可读性强
加载更多回复(7)

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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