兔子问题(斐波那契数列)

有这样一个题目:已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后第三个月开始生小兔子假如一年内没有发生死亡,则一对兔子一年内能繁殖成多少对?

之前有人做过,我却怎么想都不明白,今天自己终于想出了方法,唉,这算是我的逻辑觉醒吗?

方法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++;
}
}
//计算当前月的数量=初始时的一对兔子+当前月1个月前的所有能生小兔子的数
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) {
//1.先把前一个月的对象赋给这个月, 然后对象里的月份加1
for(var k=0;k<arr[x-1].length;k++){
var obj=createRabbit(arr[x-1][k].birth);
arr[x].push(obj);
}
//2.判断里面的兔子月份,超出则判断生小兔子
for(var i=0;i<arr[x].length;i++){
if(arr[x][i].birth>1){
arr[x].push(createRabbit());
}
}
}

此方法就实现了正常的逻辑,注意里面对象的赋值,区分什么时候该新创建对象,因为对象的值在堆里,改动任何一个该对象的引用都会改变该对象的值

堂 wechat
欢迎关注我的微信公众号,里面有各种小故事哦!
坚持原创技术分享,您的支持将鼓励我继续创作!