黑马程序员技术交流社区
标题: 循环的问题,真心的搞不懂啊,求解! [打印本页]
作者: ZHAOWEI 时间: 2014-5-10 21:09
标题: 循环的问题,真心的搞不懂啊,求解!
本帖最后由 ZHAOWEI 于 2014-5-12 21:21 编辑
5,有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面。已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第3个月起每月生一对小兔子。假如一年内没有发生死亡现象,那么,一对兔子一年内(12个月)能繁殖成多少对?
分析:兔子的规律为数列,1,1,2,3,5,8,13,21
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
f=f2;
f2=f1+f2;
f1=f;
就是搞不懂这
作者: lzhuas 时间: 2014-5-10 21:37
怎么没有区别呢?你只要把那规律弄懂了就行,这数列是第三个数等于前两个数的和,相加等于sum后,你得把原来的第二个数赋给第一个,然后把sum赋给第二个数,这样就可以循环相加嘛
作者: Yov正 时间: 2014-5-10 21:46
- /**
- *
- * 上月生下的兔子,下个月就能生兔子
- */
- public class Test {
- public static void main(String[] args) {
- int f1 = 1;// 当月能生的有多少对,也既能当月生多少对兔子
- int f2 = 1;//上月留下来了对少对
- int sum = 0;
- //假设1月来了一对新生兔子,所以到3月才能生下对兔子
- for (int i = 3; i <= 12; i++) {
- sum = f1 + f2;//参考f1,f2的定义,sum值为当月能有多少对兔子
- System.out.print(i + "值===== f1=" + f1 + " f2=" + f2);
- f1 = f2;// f2为上月留下来的对兔子,所以下个月都能生下兔子,所以下个月的f1=这个月的f2.
-
- f2 = sum;//下个月的f2,当然=这个月的sum
- System.out.println(" sum=" + sum+" f2="+f2);
- }
- System.out.println("一对兔子一年内(12个月)能繁殖成" + sum + "对。");
- }
- }
复制代码
作者: 倪大大 时间: 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
楼主,这是一个典型的斐波拉契数列问题。
简单说 那 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)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |