有这样一个题目:已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后第三个月开始生小兔子假如一年内没有发生死亡,则一对兔子一年内能繁殖成多少对?
之前有人做过,我却怎么想都不明白,今天自己终于想出了方法,唉,这算是我的逻辑觉醒吗?
方法1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| var arr=new Array(12); window.onload=function () { for(var i=0;i<12;i++){ arr[i]=new Object(); arr[i].count=0; arr[i].birth=0; } arr[0].count=1; arr[1].count=1;
for (var i = 0; i < 12; i++) { addBirth(i); if(i>1){ arr[i].count=dealCount(i); } console.log(i+1+"月为:"+arr[i].count); } }
function addBirth (x) { for(var i=0;i<x;i++){ arr[i].birth++; } }
function dealCount (x) { var rabbit=arr[0].count; for(var i=0;i<x;i++){ if(arr[i].birth>1){ rabbit+=arr[i].count; } } return rabbit; }
|
这种方法其实不是正常的逻辑,我们知道,斐波那契数列的特征是:f(n)=f(n-1)+f(n-2),按照我的正常逻辑:当月的兔子数=当前月前一个月的兔子数+前一个月可以生育的兔子生下来的兔子数,而我在上面是这样计算的:当月的兔子数=刚开始的1对+1月到当月前一个月所有会生下的兔子数
最后的结果是正确的
方法2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| function createRabbit (birth) { var obj=new Object(); obj.birth=birth || 0; return obj; } var arr=new Array(12);
window.onload=function () { for (var i = 0; i < 12; i++) { var item=new Array(); if(i==0){ item.push(createRabbit()); }else if(i==1){ item.push(createRabbit(1)); } arr[i]=item; if(i>1){ addBirth(i); dealCount(i); } console.log(i+1+"月为:"+arr[i].length); } } function addBirth (x) { for(var i=0;i<arr[x-1].length;i++){ arr[x-1][i].birth++; } } function dealCount (x) { for(var k=0;k<arr[x-1].length;k++){ var obj=createRabbit(arr[x-1][k].birth); arr[x].push(obj); } for(var i=0;i<arr[x].length;i++){ if(arr[x][i].birth>1){ arr[x].push(createRabbit()); } } }
|
此方法就实现了正常的逻辑,注意里面对象的赋值,区分什么时候该新创建对象,因为对象的值在堆里,改动任何一个该对象的引用都会改变该对象的值