一、任务说明:
给一个正整数num,返回小于或等于num的斐波纳契奇数之和。
斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。
二、思路:
先写一个函数用于产生给定num项的fibonacci数列,并将数列保存在result数组中,使result的索引对应fibonacci的项数,即第n项fibonacci数对应result[n];
三、产生Fibonacci数列的方法:
算法一:使用最常用的递归方法(当n比较大时,这种方法特别耗资源,不推荐使用)
//递归方法
function fib(num){
if(num<0){
return -1;
}else if(num===0){
return 0;
}else if(num===1){
return 1;
}else{
return arguments.callee(num-1)+arguments.callee(num-2);
}
}
算法二:数组方法
//数组方法
/*function fib(num){
var result=[];
if(num<0){
return -1;
}if(num<2){
result= num===0?[0]:[0,1];//num<2时返回结果数组
}else{
for(var i=2;i<=num;i++){
//初始值第0项为0,第一项为1
result[0] = 0;
result[1] = 1;
result[i]=result[i-1]+result[i-2];
}
}
return result;
}*/
算法三:迭代方法(效率最高)
function fib(num){
var a=0;//暂存f(n-2)
var b=1;//暂存f(n-1)
var temp=0;//暂存f(n)
var result=[0,1];//初始值
for(var i=2;i<=num;i++){
temp=a+b;
a=b;
b=temp;
result.push(temp);//将迭代计算的第n项结果存入结果数组
}
return result;
四、计算小于给定Num,且为奇数的fibonacci数之和
function sumFibs(num) {
if(num<0){
alert("please try a bigger number than zero");
}
var fibArr=fib(num);
//过滤掉不满足条件的fibonacci数
fibArr=fibArr.filter(function(item,index,arr){
return item<= num && item %2 ==1;
});
//返回累加结果
return fibArr.reduce(function(acc,val){
return acc+val;
},0);
}