导航:首页 > 源码编译 > 有些递归程序是不能用非递归算法

有些递归程序是不能用非递归算法

发布时间:2022-09-22 12:58:01

1. 所有的递归程序都能转化为非递归么

是的,所有递归都可以换成非递归,效率方面不一定能提高,看具体算法

2. C语言的两个问题:,所有的递归程序均可以用非递归算法实现递归函数中的形式参数是自动变量吗c语言

直接或间接调用自已的函数就是递归函数,否则为非递归函数。如: unsigned fun(unsigned x){ if(x==1 || x==0) return 1; return x*fun(x-1); } 这个函数的体中出现了调用自己的语句fun(x-1);,所以是递归函数。

3. 程序的递归算法与非递归有什么区别

  1. 递归算法是一种直接或者间接地调用自身的算法。

  2. 在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

  3. 递归就是在过程或函数里调用自身。

  4. 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

  5. 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

  6. 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出。

4. 程序的递归算法与非递归的区别

1、递归和非递归(用栈) 非递归(用栈),也用到栈函数了,和递归就没多大区别了! 每次递归进栈出栈,非递归(用栈)的每次调用栈函数也是进栈出栈。主要是在非递归(用栈)中,它的栈函数里比递归多了些赋值语句。。。所以效率上,非递归(用栈)比递归差。 只不过,递归越深,占用栈空间越多。非递归(用栈),占用的栈空间少。如果,递归的深度还没达到超出栈空间的程度,那么递归比非递归(用栈)好。 如果是非递归(不用栈),当然是非递归最好。 在下面的这个例子(解决“整数划分问题”)中,说明了如果只是用栈机械的模拟,得到的结果只是: 空间不变(事实上,非递归应该多一些),而非递归的时间数倍的增加。。 感兴趣的朋友运行就知道了 #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; } 2. 如果非递归不是用栈做的 这里有一个网友做的汉诺塔问题的非递归解法 看了真让人汗颜 这样的规律都有人发现 下载地址是: http://wenku..com/view/cfd56b3610661ed9ad51f3f9.html 此算法不是用大家以前熟悉的递归算法 虽然没运行 可以猜想 这个程序的空间和时间效率毫无疑问会大幅度提高。 3. 总结: 直接引用《算法设计与分析(第二版)》里的一段话: 结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,而且它为设计算法,调试程序带来很大方便。 然而递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多 仅仅是机械地模拟还不能达到减少计算时间和存储空间的目的。因此,还需要根据具体程序和特点对递归调用的工作栈进行简化,尽量减少栈的操作,压缩栈存储以达到节省计算时间和存储空间的目的。

5. 所有用递归算法的能不能都用非递归算法实现

用递归算法可以使程序结构清晰,可读性好,但是它的运行效率很低,而且会占据很大存储空间,因此有时希望在程序中消除递归.因为在计算机内递归算法实际上是用一个工作栈来实现的,所以所有的递归算法理论上来说是可以用非递归算法实现,我们可以用一个栈来模拟递归算法

阅读全文

与有些递归程序是不能用非递归算法相关的资料

热点内容
加密空投与硬分叉指南 浏览:15
加密wps文档密码忘了怎么办 浏览:685
冲程算法 浏览:988
鸡料与鸡粪的算法 浏览:833
phpif变量为空值 浏览:59
iot编译器异常 浏览:600
代理服务器被禁用怎么上网 浏览:411
隐私加密怎么设置密码 浏览:940
马丁靴补色解压 浏览:565
在设置app上怎么找到个人热点 浏览:754
按照档案号生成文件夹 浏览:1001
程序员转方向 浏览:111
lol敏捷加密 浏览:882
传统公司眼中的加密货币 浏览:430
电脑图标又出现文件夹怎么去掉 浏览:964
排序算法c和a 浏览:418
手机拍照上传android 浏览:343
linux压缩率 浏览:614
电脑浏览器加密端口 浏览:536
单片机线性电源 浏览:268