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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘乃宽 中级黑马   /  2013-7-28 21:00  /  1377 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 2013-7-30 10:54 编辑

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);   这段代码是怎么执行的啊 ?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览
cattle(n-1)递归一次,cattle(n-2)再递归一次

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

回复 使用道具 举报
cattle(n-1)递归n次,cattle(n-2)再递归n次

评分

参与人数 1黑马币 +5 收起 理由
杨兴庭 + 5

查看全部评分

回复 使用道具 举报
n是从8开始,调用cattle(n)就是计算cattle(8);
cattle(8),8>2,返回cattle(7)+cattle(6);结果是cattle(7)+cattle(6)
cattle(7),8大于2,返回cattle(6)+cattle(5);结果是2*cattle(6)+cattle(5)
cattle(6),7大于2,返回cattle(5)+cattle(4);结果是3*cattle(5)+2*cattle(4)
cattle(5),5大于2,返回cattle(4)+cattle(3);结果是5*cattle(4)+3*cattle(3))
cattle(4),4大于2,返回cattle(3)+cattle(2);
结果是8*cattle(3)+5*cattle(2)
cattle(3),3大于2,返回cattle(2)+cattle(1);
结果是13*cattle(2)+8*cattle(1)
cattle(2),是返回1,所以cattle(2)等于1
cattle(1),也是返回1,即cattle(1)等于1
所以结果是13*1+8*1=21.

其实迭代就是要一直就算到能得到值后,在往回计算原来等式的值.

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
说起来还真挺费劲。
cattle(n)先带入了cattle(8),进入方法体后,8很大所以返回的是cattle(n-1)+cattle(n-2),也就是cattle(7)+cattle(6);
同样cattle(7)也是如此它返回的是cattle(6)+cattle(5)...总之一直这样递归下去,一直到这个值为小于2或者小于0为止,再一次一次的返回到上一次的递归,最终出结果。
具体执行说起来太麻烦,把你的代码改了改,你看看应该就能理解了。
回复 使用道具 举报
  1. package cn.itheima;

  2. public class Demo {
  3.         public static void main(String[] args){
  4.         int n=8;
  5.         System.out.println("="+"共有"+cattle(n)+"头牛!");
  6.     }
  7.     public static int cattle(int n){
  8.         
  9.             if(n<=0)
  10.             return 0;
  11.         if(n<=2)
  12.             return 1;
  13.        System.out.print("当n为"+n+"时:");
  14.        System.out.println("cattle"+(n-1)+"+"+"cattle"+(n-2)+"+");
  15.         return cattle(n-1)+cattle(n-2);  
  16.         
  17.     }
  18. }
复制代码
打印看看,从最后打印的结果往回看就能明白了

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
赵然 中级黑马 2013-7-30 10:48:30
7#
告诉你个分析递归方法的小技巧,虽然笨点但是很实用:列一个计算当次的函数用角标标示下,如果里面用到了其他次的也用函数加角标标示下:比如说今天的数量等于昨天的数量的2倍加一那么就可以写成:sum今=sum昨*2+1,之后你把每天的都列出来 这样子等列到最终的时候不仅递归的函数式的大致表示的出来了,递归的条件也弄明白了 之后就可以看着分析写代码了 这样会很方便,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马