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,至于更加详细的可以自己查查看!
相关文章推荐
- JavaScript初级玩法(3)—兔子问题(斐波那契数列)
- 斐波那契数列_兔子问题
- 递归---斐波那契数列。兔子问题
- js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角
- 从兔子产仔来看斐波那契数列问题
- Java 兔子问题(斐波那契数列)扩展篇
- 初级java编程实现数学问题鸡和兔子共35个脑袋94个足
- 基础算法题----兔子问题(斐波那契数列)
- C语言_古典问题:斐波那契数列(兔子增长)
- Java 兔子问题(斐波那契数列)扩展篇
- JavaScript求斐波那契数列(Fibonacci)中的第n项问题
- 兔子产子问题(斐波那契数列)
- 兔子问题--斐波那契数列--递归--面向过程编程
- MOOC清华《程序设计基础》第6章:三种递推方法求兔子数列问题(斐波那契数列)
- Java算法--递推算法 求解兔子产子问题或斐波那契数列问题
- 【Java算法学习】斐波那契数列问题-兔子产子经典问题
- 每天一道算法--经典兔子繁殖迭代问题(斐波那契数列)
- 斐波那契数列(兔子问题)的变形
- js 斐波那契数列(兔子问题)
- java编程经典案例之基于斐波那契数列解决兔子问题实例