题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....,即下个月是上两个月之和(从第三个月开始)。
方法一:利用函数递归
<script type="text/javascript">
//总数:1,1,2,3,5,8,13,21
//月数:1,2,3,4,5,6, 7, 8
//f(1)=1;f(2)=1;
//f(n)=f(n-1)+f(n-2)
function resultFn(n){
function f(n){
if(n<3) return 1;
else {
return arguments.callee(n-1) + arguments.callee(n-2)
}
}
console.log(f(n))
}
for(let n=0;n<=40;n++){
resultFn(n)
}
</script>
我们发现利用函数递归的方式,照成了大量的重复计算,效率是非常之地的。
方法二:利用循环的方式
<script type="text/javascript">
function resultFn(n){
function f(n){
if(n<3) return 1;
else {
/* f1 f2 fn
1 1 2 n=3
1 2 3 n=4
2 3 5 n=5
3 5 8 n=4
*/
var f1=1,f2=1,fn;
for(var i=3;i<=n;i++){
fn=f1+f2;
f1=f2;
f2=fn;
}
return fn;
}
}
console.log(f(n))
}
for(let n=0;n<=40;n++){
resultFn(n)
}
</script>