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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵嘉男 中级黑马   /  2012-4-26 13:28  /  2045 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class T1{
    public static void main(String[] args){
        int n=8;
        System.out.println("共有"+cattle(n)+"头牛!");
    }
    public static int cattle(int n){
         if(n<=0)
            return 0;
        if(n<=2)
            return 1;
        return cattle(n-1)+cattle(n-2);  
    }
}


return cattle(n-1)+cattle(n-2);   这段代码是怎么执行的,求解

7 个回复

倒序浏览
就是你传进去的n的值如果不符合前面的两个if,就再传给cattle()方法,直到符合了
回复 使用道具 举报

()

本帖最后由 刘少伟 于 2012-4-26 14:15 编辑

这个是斐波那契数列(1,1,2,3,5,8,13,21……),起始的1和2(代码第二个if,n<=2情况)对应的值为1。从第三个起(也就是排除n<=0和n<=2的情况),后一个数等于前两个数的和,所以,每次计算某个数n对应的cattle值,都要调用n-1和n-2对应的cattle(),如果不符合调用条件,返回0。
回复 使用道具 举报
n=3(3是2和1的和)
cattle(2)+cattle(1)
0+1
n=4(3和2的和)
cattle(3)(2和1的和)+cattle(2)
n=5(4和3的和)
cattle(4)+cattle(3)
回复 使用道具 举报
首先我并不知道这个算法的意义是什么
return cattle(n-1)+cattle(n-2);   这段代码是怎么执行的,求解
关于 return 的这句,只是先执行完cattle(n-1)的递归,然后是cattle(n-2)的递归。然后再把结果相加
回复 使用道具 举报
  1. public static int cattle(int n){
  2. if(n<=0)
  3. return 0;
  4. if(n<=2)
  5. return 1;
  6. return cattle(n-1)+cattle(n-2);
  7. }
复制代码
这段代码是当传进来的值不满足前面两个if条件时,执行return语句,执行return语句是先把传进来的值进行减一和减二运算,再把进行减法运算的两个值分别依次作为参数调用cattle方法,当传进来的参数不满足大于等于0且小于等于2是,再次执行return语句,重复前面的步骤,直到传进来的两个参数满足小于等于0或小于等于2时,返回相应的值,并把返回值作为参数,进行之前return的重复调用运算
回复 使用道具 举报
施俊 中级黑马 2012-4-26 15:54:08
7#

调用过程如图所示,红色为结果,相加为最终
回复 使用道具 举报
8进去 返回cattle(7)+cattle(6)
再调cattle(6)+cattle(5)      +cattle(5)+cattle(4)
然后cattle(5)+cattle(4)   +cattle(4)+ cattle(3)       + cattle(4)+cattle(3) +cattle(3)cattle(2)
……
然后加起来返回
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马