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


相关推荐

  • Hsql 查询_sql数据查询

    Hsql 查询_sql数据查询还是班级,学省

    2022年9月22日
    3
  • Java报表软件设计–数据墨水让报表表格数据更快,更准确的显示

    Java报表软件设计–数据墨水让报表表格数据更快,更准确的显示

    2021年8月19日
    50
  • python 字符转数字函数_excel将字符串转数字

    python 字符转数字函数_excel将字符串转数字chr(i)数字转ascii范围的字符unichr(i)数字转unicode字符ord(c)字符转成unicode码点

    2022年10月12日
    4
  • 跳跃表(skiplist )详解及其C++编程实现

    跳跃表(skiplist )详解及其C++编程实现跳表SkipList跳表SkipList1、背景2、定义2.1、SkipList基本数据结构及其实现3、实现4、使用方法4.1、跳表的创建4.2、跳表插入操作参考跳表SkipList1、背景为什么选择跳表?目前经常使用的平衡数据结构有:B树,红黑树,AVL树,SplayTree,Treep等。跳表是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。用跳表吧,跳表是一种随机化的数据结构,目前开源软件

    2022年10月19日
    0
  • Linux 内核编程总结[通俗易懂]

    Linux 内核编程总结[通俗易懂]Linux内核编程总结   从事了几年的内核编程,对内核编程有一定的经验,现总结、吐槽下,作为标记。   任何进程都有有进程的入口点,用户态的进程,其入口点是,main函数。   那么内核的入口点是什么?个人理解整个OS,运行起来就是一个进程,   内核的入口点是init进程,在这个进程中负责:   1)子进程的创建,包括内核的线程、用户态的进程。

    2022年10月8日
    2
  • Fiddler实现手机抓包——小白入门

    Fiddler实现手机抓包——小白入门手机用fiddler抓包电脑最好是笔记本,这样能和手机保持统一局域网内;其他不多说,直接说步骤了。一.对PC(笔记本)参数进行配置  1.配置fiddler允许监听到https(fiddler默认只抓取http格式的)        打开Fiddler菜单项Tools-&gt;TelerikFiddlerOptions-&gt;HTTPS,        勾选Capt…

    2022年4月20日
    133

发表回复

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

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