我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

现象 :

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

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

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

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

输入参数:N

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

两种实现代码如下:

Java代码

package test;         public class RecursiveTest {                 public static double recursive(long n) {             if (n == 1) {                 return Math.log(1);             } else {                 return Math.log(n) + recursive(n - 1);             }         }                     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将为每个线程维护一个堆栈,堆栈里将为每个方法保存一个栈帧,栈帧代表了一个方法的运行状态。 也就是我们常说的方法栈。***一个为当前运行的栈帧。

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

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

保存当前方法的栈帧状态

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

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

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

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

本篇文章为大家展示了使用Java实现算法为什么慎用递归,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。现象 :递归是我们很经典的一种算法实现,可以很好的描述一个算法的原理!对于算法的描述、表现和代码结
2023-06-17

java递归算法怎么用

这篇文章给大家分享的是有关java递归算法怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直
2023-05-30

Java中如何使用递归算法

这篇文章给大家分享的是有关Java中如何使用递归算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、递归的定义递归,就是在运行的过程中调用自己。递归必须要有三个要素:①、边界条件②、递归前进段③、递归返回段当边
2023-06-28

java递归算法怎么应用

Java递归算法可以应用于以下场景:1. 阶乘计算:递归可以用来计算一个数的阶乘。例如,计算n的阶乘可以定义为f(n) = n * f(n-1),其中f(1) = 1。```javapublic static int factorial(i
2023-08-09

如何用PHP实现递归算法

要使用PHP实现递归算法,首先需要定义一个递归函数。递归函数是指在函数内部调用函数本身的一种方法。下面是一个使用PHP实现递归算法的示例,该算法用于计算一个数的阶乘:```phpfunction factorial($n) {// 基线条件
2023-08-24

vb递归算法怎么使用

VB递归算法使用步骤如下:1. 定义一个递归函数,函数中包含递归调用。2. 判断递归终止条件,即递归函数不再调用自身的条件。3. 在递归函数中调用自身,直到达到终止条件。4. 在递归函数中处理每个子问题的结果,最终得到整个问题的解。例如,下
2023-06-10

利用Java如何实现全排列算法和递归

利用Java如何实现全排列算法和递归?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从
2023-05-31

Java8使用lambda实现Java的尾递归

前言本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用。众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类的循环通通可以用递归来实现,这类语言的编译
2023-05-30

Java方法与递归怎么使用

今天小编给大家分享一下Java方法与递归怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。java中方法的使用什么是方法
2023-06-30

如何使用C++递归实现选择排序算法

这篇文章主要介绍了如何使用C++递归实现选择排序算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基本思想每次找出最小元素,通过交换实现将其放在乱序的首位,直到所有元素都已经
2023-06-22

怎么使用java递归算法求最大公约数

要使用递归算法求最大公约数,可以按照以下步骤进行:1. 创建一个名为"gcd"的递归函数,接受两个整数参数a和b,并返回它们的最大公约数。2. 在函数内部,使用辗转相除法来计算最大公约数。辗转相除法的基本原理是,将两个数中较大的数除以较小的
2023-08-09

java全排列递归算法怎么应用

全排列是一种经典的组合数学问题,递归算法可以很好地解决该问题。下面是一种Java递归算法实现全排列的例子:```javaimport java.util.ArrayList;public class Permutations {public
2023-09-23

怎么用Java数据结构与算法实现递归与回溯

这篇文章主要介绍“怎么用Java数据结构与算法实现递归与回溯”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Java数据结构与算法实现递归与回溯”文章能帮助大家解决问题。1.什么是递归?简单的说
2023-06-29

Oracle递归函数怎么用java实现

如何在Java中实现Oracle递归函数利用JDBC,Java可以与Oracle数据库连接并执行递归函数,允许查询在结果集上迭代。步骤:建立连接创建PreparedStatement设置参数执行查询遍历结果集处理递归调用合并结果关闭连接借助示例代码,您可以在Java中高效地使用Oracle递归函数,但需要留意递归深度限制和游标使用以优化性能。
Oracle递归函数怎么用java实现
2024-04-09

java全排列用递归怎么实现

要实现全排列的递归算法,可以按照以下步骤进行:1. 定义一个递归函数,传入当前需要排列的数组、起始索引和结束索引。2. 当起始索引等于结束索引时,表示已经遍历到数组的最后一个元素,此时输出当前排列结果。3. 否则,通过循环将当前需要排列的数
2023-08-11

Oracle递归函数怎么用java实现

在Java中,你可以通过创建一个递归函数来实现Oracle递归。以下是一个使用Java实现Oracle递归的示例:```javapublic class OracleRecursion { public static void mai
2023-09-26

C++ 函数的递归实现:递归在人工智能算法中的作用?

递归函数通过调用自身并在特定条件下返回结果来实现。在人工智能算法中,递归广泛应用于深度优先搜索、动态规划、回溯和神经网络等技术。对于处理复杂问题,递归提供了高效且简洁的解决方案。C++ 函数的递归实现:递归在人工智能算法中的作用引言递归
C++ 函数的递归实现:递归在人工智能算法中的作用?
2024-04-22

java怎么使用递归方法求阶乘

这篇文章主要介绍了java怎么使用递归方法求阶乘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java 用递归方法求阶乘一个正整数的阶乘,是所有不大于该数的正整数的积,并且0
2023-06-15

怎么用C语言递归实现火车调度算法

这篇文章主要介绍怎么用C语言递归实现火车调度算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、代码题目如下:2.8编号为1,2,3,4的四列火车通过一个栈式的列车调度站,可能得到的调度结果有哪些?如果有n列火车通
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录