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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 尹丽峰 于 2013-6-19 08:01 编辑

这个答案的源代码是这样的,

  1. public class lianxi01
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println("第1个月的兔子对数:    1");
  6. System.out.println("第2个月的兔子对数:    1");
  7. int f1 = 1, f2 = 1, f, M=24;   
  8. for(int i=3; i<=M; i++)
  9. {      
  10. f = f2;   
  11.   f2 = f1 + f2;     
  12. f1 = f;   
  13.   System.out.println("第" + i +"个月的兔子对数: "+f2);        
  14. }
  15. }
  16. }
复制代码
我一直弄不明白  f=f2  和  f1=f这两个赋值表达式到底表达什么意思?后来我去群里问了,有人这样回答的,f是兔子数,f1是表示最开始那对兔子第三个月生了的兔子数,f2表示第四个月升的兔子数,因为这道题目涉及到递归,每个月的兔子总数很有规律,就是1-1-2-3-5-8-13-21...这样的规律,可是把  f2赋值给f是什么意思?把f赋值给f1又是什么意思?思前想后就是想不明白.
于是有人又写了一个代码:
  1. public class Demo
  2. {
  3.         public static void main(String [] args)
  4.         {
  5.                 int arr1[]=new int [10];
  6.                 arr1[0]=1;
  7.                 arr1[1]=1;
  8.                 for(int i=0;i<10; i++)
  9.                 {
  10.                     if(i>1)
  11.                     arr1[i] = arr1[i1]+arr1[i-2];   
  12.                 }
  13.               for(int j =0;j<arr1.length;j++);
  14.               {
  15.                System.out.println(arr1[j]);  
  16.               }
  17. }
  18. }
复制代码
对于别人给的这个代码我是看懂了,用数组来体现我个人感觉更清晰明了,但是第一眼看上去没什么问题,仔细一看感觉有感觉有点奇怪,于是我自己改了改
  1. public class Demo
  2. {
  3.         public static void main(String [] args)
  4.         {
  5.                 int arr1[]=new int [10];
  6.                 arr1[0]=1;
  7.                 arr1[1]=1;
  8.                 for(int i=2;i<arr1.length; i++)
  9.         {
  10.                 arr1[i] = arr1[i-1]+arr1[i-2];
  11.                 System.out.println(arr1[i]);
  12.         }
  13.         }
  14. }
复制代码
这个代码不会输出第三个月和第四个月的的兔子数 ,只会从第五个月到第十二个月.第一次发帖,不知道排版有没问题,也没看到预览的按钮,要是排版不行大家将就这看吧.
写这么多其实后面两个代码只是分享下,就是第一个代码的那个问题我还是搞不懂,有人来详细说一说吗?

评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2 很给力!

查看全部评分

9 个回复

正序浏览
吕祥艺 发表于 2013-6-18 14:02
我不知道你纠结的到底是什么 是f 和f1的取出的是什么值?
那我就循环给你说下吧.....
第一个代码是打印24个 ...

我懂了,但是我觉得代码应该改改 这样看的更明白点!!
public class lianxi01
{
public static void main(String[] args)
{
System.out.println("第3个月的兔子对数:    1");//把第一个月改为第三个月,因为第三个月才有第一对兔子
System.out.println("第4个月的兔子对数:    1");//改为第四个月
int f1 = 1, f2 = 1, f, M=24;   
for(int i=5; i<=M; i++) //这里的int i=3;应该从5开始,也就是int =5;因为5月份的兔子等于3和4月分兔子总数
{      
f = f2;    //然后把第四个月兔子数记录在f
  f2 = f1 + f2;  //右边的f1是第三个月的兔子数,f2是第四个月的兔子数,而左边的f2就是第五个月的兔子数   
f1 = f;    //又因为之前f记录了第四个月的兔子总数,现在赋值给了f1,所以下个月f2=f1+f2;这里的f1就变成了第四个月
  System.out.println("第" + i +"个月的兔子对数: "+f2);        
}
}
}
你看我这样理解成不???
回复 使用道具 举报

万分感谢!
回复 使用道具 举报
本帖最后由 吕祥艺 于 2019-5-14 16:19 编辑

我不知道你纠结的到底是什么 是f 和f1的取出的是什么值?
那我就循环给你说下吧.....
第一个代码是打印24个月的.... 他的输出语句 1月 2月 都先打印出来了..之后开始循环遍历计算出3月以后的数值 他先确定了f1一月份的值
循环第一次3月
用f记录出上个月的数值是 f=f2;
之后计算出本月 就是3月   f2=f1+f; 就是1+1=2
之后再用f1去记录2月份的值 就是 f1=f


之后循环继续下去变成4月了

f=f2; 这个记录的是上次循环3月的值
f2=f1+fa;  这个就计算本月的值 就是  f+f1
f1=f; 在记录住3月的值


之后就一直这么循环.....不知道这你看不看的明白
回复 使用道具 举报
楼主如果有问题  继续追问
回复 使用道具 举报
吕祥艺 发表于 2013-6-18 12:23
class A{
        public static void main(String[] args) {
                int b=show(4);

多给新人一分
回复 使用道具 举报
吕祥艺 发表于 2013-6-18 12:23
class A{
        public static void main(String[] args) {
                int b=show(4);

这个也大概理解了,可是你还没和我解释我贴出来的第一个代码那个问题?

还有  这句话我还没学  throw new RuntimeException("数值超过范围");
回复 使用道具 举报
class A{
        public static void main(String[] args) {
                int b=show(4);
                System.out.println(b);
        }
       
        public static int show(int a){
                if(a<1)
                        throw new RuntimeException("数值超过范围");
                if(a==1)
                        return 1;
                else if(a==2)
                        return 1;
                else
                        //这就是递归调用自己就是计算自己上个月和上上个月的和 就是本月的数量了
                        return show(a-1)+show(a-2);
        }

}
这个是递归的写起来就更简洁了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

回复 使用道具 举报
他是用变量记录住 上个月 和上上个月兔子的数量 相加就是这个月的数量,  
public class Demo2 {
        public static void main(String[] args) {
                int cmd = 8;//这里控制月数
                /*假如月数大于等于三,那么第cmd个数一直会跟前两个数有关,这里定义三个变量x,y,z,
                试图去表示他们之间的关系。*/
                int x = 1;
                int y = 1;
                int z = 2;
                switch(cmd){//如果cmd<=3,直接输出。
                case 1:
                        System.out.println(x);
                        break;
                case 2:
                        System.out.println(y);
                        break;
                case 3:
                        System.out.println(z);
                        break;
                }
                int sum = 0 ;//定义一个变量,去接收第cmd个数的。
                for(int i=4;i<=cmd;i++){
                        sum = z+y;
                        y = z;
                        z = sum;                       
                }
                if(sum!=0){//此处把cmd=1,2,3的三种情况排除掉。
                System.out.println("第"+cmd+"个月兔子总数为"+sum+"个");
       
                }
        }       

这是我写的你看下吧...就简单的试验了应该没什么错

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马