社区
C++ 语言
帖子详情
递归和非递归(用栈)哪个效率更高?
runtospring
2009-04-11 09:25:24
1、递归和非递归(例如自己用栈实现八皇后问题)哪个效率更高?Google了一下,没有满意答案
2、不同的编译器编译相同的一段代码(指简单的、类似八皇后问题、迷宫问题这样的程序),是不是生成的.exe文件大小、效率也不同?
之前,我曾经把我的C++课程设计的代码(很垃圾的程序)放在vc++2008和Code::Block里分别生成.exe文件,运行时所占内存VC的要大,效率没法测试。
以上两个问题望高手解答~~感激不尽
...全文
4259
28
打赏
收藏
递归和非递归(用栈)哪个效率更高?
1、递归和非递归(例如自己用栈实现八皇后问题)哪个效率更高?Google了一下,没有满意答案 2、不同的编译器编译相同的一段代码(指简单的、类似八皇后问题、迷宫问题这样的程序),是不是生成的.exe文件大小、效率也不同? 之前,我曾经把我的C++课程设计的代码(很垃圾的程序)放在vc++2008和Code::Block里分别生成.exe文件,运行时所占内存VC的要大,效率没法测试。 以上两个问题望高手解答~~感激不尽
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
非递归效率高;递归代码写出来思路清晰,可读性强。
恩 是这样的 循环比递归的效率高
小y正在思考人生
2009-04-11
打赏
举报
回复
性能和效率上,递归最先出局~~
但递代码如5楼说的~可读性强
加载更多回复(7)
递归
:我不
用栈
非
递归
:栈使我快乐
偶尔敲代码,今天看树的遍历方式
递归
和
非
递归
方式实现,碰到了一个关于栈的问题。 栈 栈的定义:栈是限定仅在表头进行插入和删除操作的线性表。要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。"栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。(来源于百度百科)。 栈是一种Last In First ...
<数据结构>二叉树的
递归
、
非
递归
以及层次遍历算法C语言实现
二叉树是数据结构中一种非常重要的结构,熟练的掌握二叉树的创建,遍历是打好编程基础的关键。对于遍历,不能仅仅只掌握
递归
遍历,还应掌握
效率
更高
地
非
递归
遍历。对于
非
递归
的先序、中序、后序遍历要用到栈(在之前的博文中已经提到了具体的实现过程),而在层次遍历中要使用到另一种数据结构——队列,这个在之前博文中没有提到,因此在本篇博文中将会给出简单实现。 在本篇博文中给出的代码实现了:二叉树的创建、二叉树的递
leetcode 230. Kth Smallest Element in a BST-
递归
|
非
递归
原题链接:230. Kth Smallest Element in a BST 【思路-Java、Python】——
递归
实现 我们知道二分查找数(BST)的性质——任何一个节点的值均大于左子树的任意节点值,而小于右子树的任一节点值。那么这样就可以知道最小值的一个节点在树的最左端,最大值的一个节点在树的最右端。树从小到大顺序刚好满足树的中序遍历。因而,我们可以用中序遍历来处理。 由于 k 是个
汉诺塔问题的
非
递归
算法实现
在
非
递归
算法设计中,栈(Stack)和队列(Queue)是最为常见的数据结构。栈是一种后进先出(LIFO, Last In First Out)的数据结构,只能在一端(称为栈顶)进行插入和删除操作。队列是一种先进先出(FIFO, First In First Out)的数据结构,支持在一端添加元素,而在另一端移除元素。对于栈而言,它适用于那些需要回溯或撤销操作的场景,例如表达式求值、浏览器的后退功能等。队列则非常适合处理按顺序排列或处理的任务,如任务调度、打印队列等。
递归
非
递归
http://blog.chinaunix.net/space.php?uid=20384806&do=blog&id=1954176
递归
算法实际上是一种分而治之的方法,它把复杂问题分解为简单问题来求解。对于某些复杂问题(例如 hanio塔问题),
递归
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章