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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 面试:精通Java;面试官:来讲一下JVM虚拟机内存模型的最底层原理,必须说详细说清楚,知其所以然。看完后,你还敢在简历上写精通Java吗?

    面试:精通Java;面试官:来讲一下JVM虚拟机内存模型的最底层原理,必须说详细说清楚,知其所以然。看完后,你还敢在简历上写精通Java吗?面试简历:精通Java和JVM面试官:来说说JVM虚拟机内存模型的最底层原理,必须说详细说清楚,达到知其所以然的目的。看完后你还敢在简历上写精通Java吗?

    2022年5月12日
    34
  • 【Python 局域网控制】——做一个超简单的局域网指令控制电脑

    【Python 局域网控制】——做一个超简单的局域网指令控制电脑程序分为两部分,一个是客户端也是被操控的端口,另一个是服务端就是用来操作被操控的端口点个赞留个关注吧!!程序很简单,是通过局域网聊天系统改造而成,没有高级的GUI框架,只有简简单单的DOS窗口,这个仅供学习,当然也可以在你的第二台电脑里放入客户端,然后用服务端进行指令操作,也是很不错的。客户端会自动获取你的IPv4地址,并显示出来,需要用客户端给出的IP地址去服务端进行连接。执行指令也很简单,用接收到的数据进行os.system()进行执行。想法多的也可以做一个鼠标定位数据传输,可达到鼠

    2022年6月22日
    34
  • c语言sigaction,使用sigaction(),c[通俗易懂]

    c语言sigaction,使用sigaction(),c[通俗易懂]让我们试着了解修改后的代码版本会发生什么:#include#includevoidtermination_handler(intsignum){printf(“Hellofromhandler\n”);sleep(1);}intmain(void){//Structsthatwilldescribetheoldactionandthenewaction//ass…

    2022年5月26日
    47
  • pycharm 安装库_基础笼安装视频

    pycharm 安装库_基础笼安装视频进入Settings打开选项卡,库右侧有一个加号,点击加号在输入框里搜索要安装的库就行(已经安装过的颜色会改变)点击会出现这里面是一些常用库的下载地址,可以自己添加附上我的常用地址:http://mirrors.aliyun.com/pypi/simple/https://pypi.tuna.tsinghua.edu.cn/simple/以上,就是Pycharm安装库的…

    2022年8月25日
    10
  • excel隐含模块编译错误_打印提示错误

    excel隐含模块编译错误_打印提示错误一、灾难性问题(这是编译的设置引起的):解决办法:Debug换成AnyCPU但是,使用AnyCpu,出现了以下警告所生成项目的处理器架构“MSIL”与引用“ImageViewControlLib”的处理器架构“AMD64”不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改您的项目的目标处理器架构,以使您的项目与引用间的处理器架构保持一致,或者为引用关联一个与…

    2025年12月6日
    4
  • C语言 最长回文子串[通俗易懂]

    C语言 最长回文子串[通俗易懂]描述:输入一个字符串,求其中最长回文子串。子串的含义是:在字符串中连续出现得字符串片段。回文的含义是,正着看和倒着看是相同的,如abba何abbebba。在判断时要求忽略所有的标点和空格,且忽略大小写。但输出时按原样输出(首尾不要输出多余的字符串).输入字符串长度大于等于1小于等于5000.且单独占一行。输入:输入一行字符串。输出:输出所要求的回文子串。样例输入:L…

    2022年6月7日
    57

发表回复

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

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