所有的递归算法是否都可以转化为非递归算法?

ZhaoJuFei 2017-03-01 08:24:06
都知道递归算法很消耗资源,数据量大时根据不具有价值,而且不易于阅读。
...全文
1470 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhaoJuFei 2018-12-06
  • 打赏
  • 举报
回复
引用 4 楼 带你撸出一手好代码 的回复:
递归的可读性比较强, 函数式编程语言都采用递归解决问题的。 递归的效率是存在的问题,拿java来说, 一个函数调用在虚拟机中会创建一个栈帧, 里面还有局部变量表, 占用空间, 所以从性能考虑不应使用递归 。 但是现代的编译器对递归的优化已经做的比较好了, 写成尾递归, 在编译器将代码转换为机器码时,会变成普通循环来执行的
我最近也对jvm研究了下,递归算法改成非递归往往也需要一个栈的数据接口存储数据。效果最后差不多。
computerclass 2017-03-02
  • 打赏
  • 举报
回复
所有的递归算法都可以转化为非递归算法,数据结构上讲的有
ps45221 2017-03-02
  • 打赏
  • 举报
回复
可以。 插一句,递归算法是比较耗资源,当递归层次太深时,容易造成爆栈,但是递归算法应该是好理解的把。 非递归算法,才不好理解把。
挨踢直男 2017-03-02
  • 打赏
  • 举报
回复
递归的可读性比较强, 函数式编程语言都采用递归解决问题的。 递归的效率是存在的问题,拿java来说, 一个函数调用在虚拟机中会创建一个栈帧, 里面还有局部变量表, 占用空间, 所以从性能考虑不应使用递归 。 但是现代的编译器对递归的优化已经做的比较好了, 写成尾递归, 在编译器将代码转换为机器码时,会变成普通循环来执行的
李德胜1995 2017-03-02
  • 打赏
  • 举报
回复
递归算法都可以转化为非递归算法,但效率低下,谨慎使用
/** * * @author SunnyMoon */ /** * 概念介绍: * * 递归的二分查找: 想用最少的比较次数在一个有序的数组中找到一个给定的数据项。 * * 非递归的二分查找:二分查找也可以用非递归算法,但是分治算法通常要回到递归。分治算 * 法常常是一个方法,在这个方法中含有两个对自身的递归的调用。 * * 分治算法:递归的二分查找是分治算法的一种实现方法。把一个是问题分成两个更小的问题, * 并且解决它们。这个过程一直持续下去直到易于求解的基值情况,就不需再分了。 * 分治算法常常是一上方法,在这个方法中含有两个对自身的递归调用,分别对应于 * 问题的两个部分。在二分查找中,就有两个这样的调用,但是只有一个真的执行了 * (调用哪一个取决于关键字的值)。 * 递归的效率:调用一个方法会有一定的代价和开销。首先,控制必须须从当前位置转移到调用 * 方法的开始处。其次,传给这个方法的参数以及这个方法返回地址都要初压到一 * 个栈里,为的是方法能够访问参数以及知道返回值在存储在哪里,这个过程也称 * "保存现场"。递归方法的使用的本质是从概念上简化了问题,而不是因为它更有 * 效率。当使用递归的效率很低的时候,就可以考虑如果把递归转化非递归。 */ class OrdArray { private long[] a; private int nElems; public OrdArray(int max) { a = new long[max]; nElems = 0; } public int size() { return nElems; } public int find(long searchKey) { return recFind(searchKey, 0, nElems - 1);//调用递归方法 //return recFind2(searchKey, 0, nElems - 1);//调用非递归方法 } public int recFind(long searchKey, int lowerBound, int upperBound) {//递归方法定义 int curIn = (lowerBound + upperBound) / 2; if (a[curIn] == searchKey) { return curIn; } else if (lowerBound > upperBound) { return nElems; } else { if (a[curIn] < searchKey) { return recFind(searchKey, curIn + 1, upperBound); } else { return recFind(searchKey, lowerBound, curIn - 1); } } } public int recFind2(long searchKey, int lowerBound, int upperBound){//非递归方法定义 int curIn=0; while(true){ curIn=(lowerBound+upperBound)/2; if(a[curIn]==searchKey) return curIn; else if(lowerBound>upperBound) return nElems; else{ if(a[curIn]value) break; for(int k=nElems; k>j; k--) a[k]=a[k-1]; a[j]=value; nElems++; } public void display(){ for(int j=0; j转化成非递归。 */

67,511

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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