A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 章闽 中级黑马   /  2012-10-21 19:01  /  1533 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test {
  public static void main(String arg[]){
   System.out.println(Method(5));
   }
   public static int Method(int n){
    if(n==1)
         return 1;
         else
           return n*Method(n-1);
    }
}
这个是算5的阶乘的 不明白是怎么循环的

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

7 个回复

正序浏览
递归:其实是在不断直接调用本身或间接调用本身。

5的阶乘相当于 5!=5*4!=5*4*3!=5*4*3*2!=5*4*3*2*1---->
                     1*2*3*4*5=2!*3*4*5=3!*4*5=4!*5=5!
对应程序代码就是
if(n==1) return 1;
else  return n*Method(n-1)   Method(n-1)调用本身。以此类推如下:

Method(5) -->5*Method(5-1)        Method(5-1) --> 4*Mehod(4-1)  Method(4-1) --> 3*Method(3-1)

Method(2) --> 2*Method(2-1)   逆向后推

判断条件中当 n==1时,return  1;所以  
Method(1) -->1   
Method(2)-->2*Method(1)-->2*1
Method(3)-->3*Method(2)-->3*2*Methode(1)-->3*2*1     
Method(4)-->4*Method(3)-->4*3*Methode(2)-->4*3*2*Methode(1)-->4*3*2*1   
Method(5)-->5*Method(4)-->5*4*Method(3)-->5*4*3*Method(2)-->5*4*3*2*Method(1)-->5*4*3*2*1        再往前推


所以先往后推再往前推,所以递推,需要限定条件。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
陈琦 中级黑马 2012-10-21 22:38:00
7#
2楼图画的好,还是图片一目了然
回复 使用道具 举报
我觉得把你倒过来想的话 应该就很好理解了,
    先是N==1   返回1
       Method(n-1)的值应该是2才可以在调用的时候N的值等于1
    那么N==2  返回2*1
       Method(n-1)的值应该是3才可以在调用的时候N的值等于2
       然后N==3  返回3*2*1
       Method(n-1)的值应该是4才可以在调用的时候N的值等于3
        然后N==4  返回4*3*2*1     
        Method(n-1)的值应该是5才可以在调用的时候N的值等于4
        因为5是我们给Method调用的值,最后返回5*4*3*2*1=120即输出结果

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先主函数调用Method的方法,然后把值5传给N
如果N等于1的时候返回1 其他时候执行 2*2-1
以此类推 3*2*1最后变成 5×4×3×2×1=120.
回复 使用道具 举报
这还是得看你对递归理解了没有.
其实递归递归,从字面上解释就是在方法本身调用自己的方法,或者间接调用;
看你上面的程序,拿Method(5)来说:      
n=5;
执行 5*Method(4);      
--------------------      
这时候看Method(4)      
n=4 执行 4*Method(3);      

.-------------------      
看Method(3)      
n=3,执行 3*Method(2);      
---------------      
Method(2);      
n=2 执行 2*Method(1);      
这时候,return 1;往上返回      
2*1向上返回      
3*(2*1)向上返回      
4*(3*(2*1)) 向上返回      
5*(4*(3*(2*1)) ) = 120      
所以程序输出120;      
这事简单的递归的例子;
所以可以看出来递归的关键得有递归出口(本体的If语句),还有递归方法;

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

回复 使用道具 举报
是递归方法,过程是:5*4*3*2*1=120
回复 使用道具 举报
希望你能看得懂,递归就是自身调用自身的方法

无标题.jpg (106.91 KB, 下载次数: 18)

无标题.jpg

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马