黑马程序员技术交流社区

标题: 循环的问题,真心的搞不懂啊,求解! [打印本页]

作者: ZHAOWEI    时间: 2014-5-10 21:09
标题: 循环的问题,真心的搞不懂啊,求解!
本帖最后由 ZHAOWEI 于 2014-5-12 21:21 编辑

5,有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面。已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第3个月起每月生一对小兔子。假如一年内没有发生死亡现象,那么,一对兔子一年内(12个月)能繁殖成多少对?
分析:兔子的规律为数列,1123581321
public class Fobonacci1 {
    public static void main(String[]args){
     int f1 = 1;
     int f2 = 1;
     int sum = 0;
     for(int i = 3; i <= 12; i++){
     sum = f1 + f2;
     f1 = f2;//原答案是这么写的,这是不是写错了,这和没写有什么区别?
     f2 = sum;     
     }
System.out.println("一对兔子一年内(12个月)能繁殖成" + sum + "对。");
}
}

作者: 陈妙俊    时间: 2014-5-10 21:29
public class ClassDemo1 {
        public static void main(String[] args){
                //兔子的规律为数列,1,1,2,3,5,8,13,21
                int M=12,f1=1,f2=1,f;
                for(int i=3;i<M;i++){
                        f=f2;
                        f2=f1+f2;
                        f1=f;
                        System.out.println(f2);

                }
        }
}

作者: ZHAOWEI    时间: 2014-5-10 21:33
陈妙俊 发表于 2014-5-10 21:29
public class ClassDemo1 {
        public static void main(String[] args){
                //兔子的规律为数列,1,1,2,3 ...

    f=f2;
     f2=f1+f2;
    f1=f;
就是搞不懂这
作者: lzhuas    时间: 2014-5-10 21:37
怎么没有区别呢?你只要把那规律弄懂了就行,这数列是第三个数等于前两个数的和,相加等于sum后,你得把原来的第二个数赋给第一个,然后把sum赋给第二个数,这样就可以循环相加嘛
作者: Yov正    时间: 2014-5-10 21:46
  1. /**
  2. *
  3. * 上月生下的兔子,下个月就能生兔子
  4. */
  5. public class Test {
  6.         public static void main(String[] args) {
  7.                 int f1 = 1;// 当月能生的有多少对,也既能当月生多少对兔子
  8.                 int f2 = 1;//上月留下来了对少对
  9.                 int sum = 0;
  10.                 //假设1月来了一对新生兔子,所以到3月才能生下对兔子
  11.                 for (int i = 3; i <= 12; i++) {
  12.                         sum = f1 + f2;//参考f1,f2的定义,sum值为当月能有多少对兔子
  13.                         System.out.print(i + "值===== f1=" + f1 + "  f2=" + f2);
  14.                         f1 = f2;// f2为上月留下来的对兔子,所以下个月都能生下兔子,所以下个月的f1=这个月的f2.
  15.                        
  16.                         f2 = sum;//下个月的f2,当然=这个月的sum
  17.                         System.out.println(" sum=" + sum+" f2="+f2);
  18.                 }
  19.                 System.out.println("一对兔子一年内(12个月)能繁殖成" + sum + "对。");
  20.         }
  21. }
复制代码

作者: 倪大大    时间: 2014-5-10 23:02
这个逻辑题挺有意思. 其实到12个月时一共有多少兔子.根据规律可得是 10月的兔子量+11月的兔子量对吧
然后 f1最先初始化是1对兔子,代表一月的兔子量.2月兔子量f2 也是1对,代表2月的兔子量.真正开始变化是从第三个月开始的
  这个文字不是很好描述 我尽量表达清楚吧 你看能理解不
  现在我们求第三个月的兔子量,根据规律可得 是  一月的加上2月的兔子量. 所以得 S3 (代表三月份的兔子量)=s1+s2; 然后当我们求第四月份的兔子量时,我们最先定义的 f1是指一月份的,那么现在求四月份的时候 f1就应该代表2月份是吧? 那么 就有 f1=f2 这么一个交换等式,  然后 现在的f2 应该等于三月份的兔子总量吧, 这时候三月份的兔子总量就是sum 所以 f2=sum;  所以四月份的总量就等于 现在的f1(也就是2月份的兔子总量)+现在的f2(三月份的兔子总量).   依次类推. 你看明白了否
作者: 种一棵树    时间: 2014-5-10 23:13
经典的斐波拉契数列问题
作者: 彭飞    时间: 2014-5-11 00:18
前两个数字相加等于后一个数字,这个规律好有意思的说。
作者: 张辉玉    时间: 2014-5-11 00:33
ZHAOWEI 发表于 2014-5-10 21:33
f=f2;
     f2=f1+f2;
    f1=f;

楼主,这是一个典型的斐波拉契数列问题。
简单说 那   f=f2  就是把上个月的兔子数量  赋值给 f,
f2 = f1 + f2;    就是把上个月兔子数f2 + 上上个月兔子数f1  赋值给新的f2,
f1 = f;       现在的 f上面已经赋值了是f2,将它赋值给f1就是  就是把上个月的兔子数赋值给上上个月。。
这样就能形成循环。

斐波拉契数列问题就是  现在的数 = 前个数 + 前前个数。
作者: 张盼    时间: 2014-5-11 00:33
有区别,这是用于对变量的位置进行调换,把f2的值赋给f1,在下一次循环中使用。

作者: ZHAOWEI    时间: 2014-5-11 06:33
   我晕,谢谢大家的回答了!貌似我犯二了,我看到题读了两遍还没理解就开始做,而且还看错了,我以为兔子三个月才生一窝,刚才又看了看题,原来是一个月生一窝,所以没弄明白f1=f2,以后得注意这个问题了。。。。
作者: pandapan    时间: 2014-5-12 04:47
问题一步一步分析吧,首先说说这个题目吧,
1. 同学已经分析出 这个序列的规矩,那就是 f(n) = f(n-1)+f(n-2);(n>=3)  即兔子的总量  = 上个月的兔子数量+上上个月的兔子的数量
2. 分析出这样的话,其实答案就已经差不多出来了,同学迷惑的的是为什么会发生这样数据的交换,建议还是用笔和纸来画一下,这里变量感觉命名含义并不明显,可以这样来命名嘛,将f2命名为lastMonNum,即上个月的兔子数量,,f1命名为monthBeforeLastNum,上上个月的兔子数量。这样在循环中,然后找出一个月份,比如说四月,在将四月份的兔子的数量算出来之后,下次循环便要开始算五月份的,那么参照四月份来讲,lastMonNum为三月份的,五月份的monthBeforeLastNum = 四月份的lastMonNum.,即在四月份算出数量后,将f1 = f2,为下次循环做准备。


作者: 编程学徙    时间: 2014-5-12 13:35
[ 本帖最后由 编程学徙 于 2014-5-12 13:37 编辑 ]\n\n[code]/**
*关于兔子问题:有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面。已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第3个月起每月生一对小兔子。假如一年内没有发生死亡现象,那么,一对兔子一年内(12个月)能繁殖成多少对?
分析:兔子的规律为数列,1,1,2,3,5,8,13,21。
*的算法分析:
*第一个月兔子数为1,第二个月也为1,以后的每一个月,都等于之前两个月的和。其实,如果用递归来实现这个算法,也许会更好一些。。
*问题的数学表达式为:假设用n来表示第几个月,用f(n)来表示第n个月的兔子总数,那么应该有:
*if(n==1||n==2)fob(n) = 1;
*else fob(n) = fob(n-1)+fob(n-2);
*/

class  Fobonacci
{
        public static int fob(int n)                                                                        //fob方法用以计算第n个月的兔子数,并将值返回给主方法;
        {
                int sum;
                if(n==1||n==2) sum = 1;                                                                                //第3个月开始,兔子数为之前两个月相加;
                else sum = fob(n-1)+fob(n-2);
                return sum;
        }
               
        public static void main(String[] args)
        {
                System.out.println("第20个月的兔子总数为:"+fob(20));                //输出结果;
        }
}
[/code]




程序很简单,不过真心说,我觉得这种假设过于理想化,不科学,要是养兔子真那么好赚,我就铁心养兔子去了,还学什么程序员啊!!!

兔子.jpg (63.66 KB, 下载次数: 70)

兔子.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2