Java的递归算法

Java的递归算法

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到可以直接求解,也就是说到了递推的出口,这样原问题就有递推得解。

关键要抓住的是:

(1)递归出口

(2)地推逐步向出口逼近

样例:

example: 求5的阶乘。。      

  

例如以下:   

  

Java代码
复制代码

  1. public class Test {         
  2. static int multiply(int n){         
  3. if(n==1||n==0)         
  4. return n;         
  5. else         
  6. return n*multiply(n-1);         
  7. }         
  8.       
  9. public static void main(String[] args){         
  10. System.out.println(multiply(10));         
  11. }         
  12. }      

  

  

上面的multiply是一个阶乘的样例。事实上递归递归,从字面上解释就是在方法本身调用自己的方法,或者间接调用;看上面的程序,拿multiply(5)来说:   

n=5;运行 5*multiply(4);   

——————–   

这时候看multiply(4)   

n=4 运行 4*multiply(3);   

——————-   

看multiply(3)   

n=3,运行 3*multiply(2);   

—————   

mulitply(2);   

n=2 运行 2*mulitply(1);   

这时候,return 1;往上返回   

2*1向上返回   

3*(2*1)向上返回   

4*(3*(2*1)) 向上返回   

5*(4*(3*(2*1)) ) = 120   

所以程序输出120;   

这事简单的递归的样例;所以能够看出来递归的关键得有递归出口(本体的If语句),还有递归方法;   

下面是我在百度知道碰到一个朋友的提问,也是关于递归算法的:

————————问题——————————

本人刚学JAVA,没有不论什么编程基础,各位高手见笑。

Java代码
复制代码

  1. public class Count   
  2. {   
  3.     static void count(int n)               //递归方法   
  4.     {   
  5.         if (n<5)    
  6.             count(n+1);    
  7.         System.out.print(”     “+n);   
  8.     }    
  9.     public static void main(String args[])   
  10.     {   
  11.         count(1);   
  12.         System.out.println();   
  13.     }   
  14. }  

请具体解说这段程序是怎么运行的,我的理解是先运行main函数里的count(1),然后进入count方法,N值为1,所以运行IF语句,直到count(5),此时退出if 循环,打印N=5 ,然后应该没有要运行的东西了,但是答案是5     4     3     2     1 ,请问这是怎么回事,谢谢!

——————–回答—————————

先运行count(1),然后进入count方法,N值为1,所以运行IF语句,也就是运行count(2),然后进入count方法,N值为2,所以运行IF语句,也就是运行count(3),然后进入count方法,N值为3,所以运行IF语句,也就是运行count(4),然后进入count方法,N值为4,所以运行IF语句,也就是运行count(5),然后进入count方法,N值为5,所以不运行IF语句,然后运行System.out.print(” “+n); 也就是输出5,然后本次參数为5的count方法调用结束了,返回到调用它的參数为4的count方法中,然后运行System.out.print(” “+n);输出4,然后一直这样下去,输出3,2,1 。这里须要说明的是在运行count(5)的时候,count(4)、count(3)、count(2)、count(1)都没有运行完成,他们都在等自己方法体中的count(n+1)运行完成,然后再运行System.out.print(” “+n);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118127.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月10日 下午2:00
下一篇 2021年12月10日 下午3:00


相关推荐

  • 几款移动跨平台App开发框架比较[通俗易懂]

    几款移动跨平台App开发框架比较[通俗易懂]整理目前流行的跨平台WebApp开发技术的特点,仅供参考。每个框架几乎都包含以下特性:使用HTML5+CSS+JavaScript开发; 跨平台重用代码; 丰富的UI库; 提供访问设备原生API的JavaScriptAPI包装器; 解决原生开发中机型适配的难题; 提供打包、部署的工具或服务; 都需要学习自身封装的JavaScriptAPI;筛选框架的要求…

    2022年5月3日
    725
  • 关于Virt-P2V那点事

    关于Virt-P2V那点事在实现企业服务器虚拟化的时候,许多系统已经是NT或Windows 2000的老系统,要安装上虚拟机还得重装系统,但是已经找不到光盘或是驱动程序了,因此重装系统是无法成功的,要将旧服务器虚拟化,最好的办法就是实体机转换(P2V)。一、什么是P2V?P2V是Physical to virtual的简称,即物理到虚拟。它是指将物理机上的系统、应用软件以及数据转换到虚拟机中。它的工作原理是将物

    2022年7月26日
    10
  • 在带有双硬盘的Windows10系统上安装Ubuntu16.04系统

    在带有双硬盘的Windows10系统上安装Ubuntu16.04系统最近在看深度学习 需要使用 TensorFlow 跑程序 虽然在 Windows 系统上也可以使用 GPU 进行加速 好不容易安装将近两天在 Windows10 上成功配置 GTX1080TI Anaconda3 cuda8 0 cudnn6 0 但是 跑程序时出个莫名的问题 不知道是不是 Windows 系统的问题 一直没有解决 所以今天就尝试着在 Windows 系统基础上安装 Linux 系统 Windows

    2026年3月26日
    2
  • Manus超体使用教程

    Manus超体使用教程

    2026年3月15日
    1
  • 内存分配——静态存储区 栈 堆 与static变量

    内存分配——静态存储区 栈 堆 与static变量一、内存基本构成   可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。   静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。   栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的

    2022年6月10日
    35
  • 序列化和反序列化的底层实现原理是什么?

    序列化和反序列化的底层实现原理是什么?序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一个问题,自信满满的说了一大堆,什么是序列化、什么是反序列化、什么场景的时候才会用到等,然后面试官说:那你能说一下序列化和反序列化底层是如何实现的吗?一脸懵逼,然后回家等通知!一、…

    2022年6月15日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号