专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java基础学习:java中的递归算法

Java基础学习:java中的递归算法

更新时间:2020-04-24 14:15:18 来源:动力节点 浏览3443次

    递归是工作中经常会使用到的一种算法,比如阶乘的计算就是利用递归来实现的,如果您还没有接触编程方面的内容,要理解递归其实并不困难,它就是在一个函数的内部调用了本身,执行的情况特别类似是一个循环,如果要这么说递归似乎没有什么好说的,但是在这里我希望和大家讨论的是递归这种算法在使用的时候对系统性能的影响,同时也会和大家分析下在递归函数执行过程中内存的变化情况。

    特别提醒,在下述内容中方法和函数是同一个意思。

    递归的实现

    为了让大家更好的理解接下来介绍的内容,同时也为了照顾那些并没有了解过递归的读者,这里我们先来为搭建演示下在Java中到底如何通过递归来实现阶乘计算的:

Java基础学习:java中的递归算法

    对于上述这段代码来说,开发人员并不陌生,这也是阶乘最简单的例子,大家可以看到在阶乘运算函数factorial()中,如果传入的参数大于1的话,就会进行一次乘法运算,通过断点调试理解这个过程并不困难,但是在这里想和大家讨论的是在这个阶乘运算过程中,系统的内存是如何变化的呢?在上一篇文章中和大家提到过,在系统运行过程中函数参数以及其中的变量都会存放在栈中,那么像这种重复调用自己的函数它的栈是如何变化的呢?通过研究这种变化,就可以知道这种算法在工作中对系统的性能有多大的影响,这是一个值得所有开发人员思考的问题。

    递归的分析

    要研究清楚刚才的问题,我们必须先清楚在程序运行过程中,如果一个函数调用了另外一个函数,那么接下来会发生怎样的情况?这里设置了这样一段代码,就是当数值小于10的时候,加上1输出,如果大于10的话,需要先减去10,再加上1输出(当然,这段代码没有任何作用,纯粹是为了制造一个这样的场景),在Java中可以用如下的方法实现:

Java基础学习:java中的递归算法

    我们可以看到,在这段代码中,add中调用了另外一个方法sub,但是这时候add方法并没有结束,所以在程序中应该存在两个栈,分别是存储sub、add两个方法中内容的,也就是如下情况:

Java基础学习:java中的递归算法

    为什么sub对应的栈会在add上边呢?这是因为栈是后进先出的,因为sub方法在add方法之后执行,所以sub对应的栈应该在add上边,当sub方法执行完毕之后,系统自动销毁这块空间,重新又回到了add方法中,最后当程序结束的时候add方法对应的空间也会被销毁,其中的变量、参数也会随着被消失,为了方便大家理解这个过程,这里准备了一张过程图:

Java基础学习:java中的递归算法

    到这里为止,我们知道了在一个函数中运行另外一个函数,会在内存中为这个函数开辟一块空间,当这个函数执行完毕之后,这块空间会被计算机销毁,重新回到之前的函数中,也就是说在此之前,运行的这个函数占据的空间一直存在,明白这个道理之后,我们再次回到刚开始的递归算法中。假设我们现在要计算3的阶乘,那么在整个过程中,内存的变化就可以这样表示:

Java基础学习:java中的递归算法

    很显然,随着我们传入的参数越来越大,整个过程会越来越复杂,而每次调用递归函数调用自身之后,都会在计算机中开辟一块新的空间,这说明使用此种方法对系统的性能会有一定的影响,特别是当我们递归执行的次数很多的时候,特别容易造成系统崩溃。

 以上就是动力节点java培训机构的小编针对“Java基础学习:java中的递归算法”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>