使用Java实现算法为什么慎用递归

发布时间:2021-11-24 13:38:57 作者:柒染
来源:亿速云 阅读:286

本篇文章为大家展示了使用Java实现算法为什么慎用递归,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

现象 :

递归是我们很经典的一种算法实现,可以很好的描述一个算法的原理!对于算法的描述、表现和代码结构理解上,递归都是不错的选择!

但是本文想说的是java实现一个递归算法的时候尽量不要用递归实现,而是转换成的非递归实现。

最近在实现一个比较复杂算法的时候,尝试了一下,非递归实现相比递归实现速度上能提升1/3。

以下面一个简单的例子来说:(注:为了描述简单,所以这里只用一个简单的例子)

输入参数:N

输出结果: log1+log2+log3+....+logN

两种实现代码如下:

Java代码

package test;         public class RecursiveTest {         /**         * 递归实现         *          * @param n         * @return         */        public static double recursive(long n) {             if (n == 1) {                 return Math.log(1);             } else {                 return Math.log(n) + recursive(n - 1);             }         }             /**         * 非递归实现         *          * @param n         * @return         */        public static double directly(long n) {             double result = 0;             for (int i = 1; i <= n; i++) {                 result += Math.log(i);             }             return result;         }             public static void main(String[] args) {             int i = 5000000;             long test = System.nanoTime();             long start1 = System.nanoTime();             double r1 = recursive(i);             long end1 = System.nanoTime();             long start2 = System.nanoTime();             double r2 = directly(i);             long end2 = System.nanoTime();                 System.out.println("recursive result:" + r1);             System.out.println("recursive time used:" + (end1 - start1));             System.out.println("non-recursive result:" + r2);             System.out.println("non-recursive time used:" + (end2 - start2));         }     }

得到运行结果如下:

recursive result:7.212475098340103E7  recursive time used:539457109   non-recursive result:7.212475098340103E7  non-recursive time used:282479757

可以看出递归的运行时间是非递归运行时间将近2倍。

(注:以上代码还是在-Xss200m的参数下运行的,如果栈空间不足,直接不能运行)

原因简单分析:

使用Java实现算法为什么慎用递归

上图是java线程栈的结构。java将为每个线程维护一个堆栈,堆栈里将为每个方法保存一个栈帧,栈帧代表了一个方法的运行状态。 也就是我们常说的方法栈。***一个为当前运行的栈帧。

那么每一次方法调用会涉及:

1.为新调用方法的生成一个栈帧

2.保存当前方法的栈帧状态

3.栈帧上下文切换,切换到***的方法栈帧。

递归实现将导致在栈内存的消耗(往往需要调整Xss参数)和因为创建栈帧和切换的性能开销,最终大大的影响效率!

所以,如果你想提升你的算法效率,不要使用递归实现是一个基础原则!

另外,递归是我们用来理解算法的一个方法,当用代码来实现的时候基本都可以转换成非递归的代码实现!

上述内容就是使用Java实现算法为什么慎用递归,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. java实现递归求子集
  2. 递归算法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:C++如何实现扫描系统进程

下一篇:C++语言中类与对象是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》