您的位置:首页 > Web前端 > JavaScript

JavaScript初级玩法(3)—兔子问题(斐波那契数列)

2017-04-17 21:52 302 查看

问题

有人想知道一年内一对兔子可繁殖成多少对,便筑了一道围墙把一对兔子关在里面。已知一对兔子每一个月可以生一对小兔子,但是一对兔子要从出生后第三个月才开始生小兔子假如一年内没有发生死亡,则一对兔子一年能繁殖成多少对?

代码

function f(){
var n1 = 1;  //第一个月兔子数量
var n2 = 1;  //第二个月兔子数量

for(var i=0;i<5;i++){
n1=n1+n2;
n2=n1+n2;
}
console.log(`一年后,共有${n2}对兔子`);
}
f();


运行结果

一年后,共有144对兔子

分析

解决这种问题,我们一定要找到其中的规律,看下图



从图中我们能看到的规律:

从第三个月开始,第n个月兔子的总对数=第(n-1)月兔子的总对数+第(n-2)月兔子的总对数,也就是前面相邻两项之和,构成了后一项。

仔细思考这个规律,我们来写代码,这个规律其实就是在不断的把前两项相加,得到后一项,不断的重复这个事情,想到这我们应该会想到用循环来写,第一个月和第二个月比较特殊,我们声明两个变量来代表他们,然后就简单了,不断的把这两个变量相加,然后赋值就好,循环多少次呢?每次的相加,赋值,我们都会得到两个月兔子的总对数,除去第一个月和第二个月,要计算一年的兔子的总对数话,我们就循环5次,现在我们来看看每个月兔子的总对数,这里为了方便显示,我多循环一次。

代码

function f(){
var n1 = 1;  //第一个月兔子数量
var n2 = 1;  //第二个月兔子数量
var m  = 0;  //月份
for(var i=0;i<6;i++){
console.log(`第${(++m)}个月,共有${n1}对兔子`);
console.log(`第${(++m)}个月,共有${n2}对兔子`);
n1=n1+n2;
n2=n1+n2;
}
}
f();


运行结果



总结

现在问题算是解决了,我们再来看一种代码量更少的实现方法

function f(n){
if(n == 1 || n == 2){
return 1;
}
return f(n-1)+f(n-2);
};
console.log(`共有${f(12)}对兔子`);


这种方法就是利用了递归。

递归是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。

递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

说的简单点,递归就是在一个函数内,又调用了自己,但是递归调用的内层函数,是在外层函数还未结束时就已经开始了,外层函数的调用,就会被阻塞,所以缺点就是,算法复杂度太高,而且太浪费内存。至于斐波那契数列,就是我们得到的那段数字 1,1,2,3,5,8,13,21,34,55,89,144,至于更加详细的可以自己查查看!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息