FCC-Sum All Odd Fibonacci Number

2017-11-22  本文已影响0人  zooeydotmango

给一个正整数num,返回小于或等于num的斐波纳契奇数之和。
斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。
例如,sumFibs(4)应该返回 5,因为斐波纳契数列中所有小于4的奇数是 1、1、3。
提示:此题不能用递归来实现斐波纳契数列。因为当num较大时,内存会溢出,推荐用数组来实现。
博客园
issue

刚开始以为是挺简单的题目,后来仔细看了需求有点傻眼,返回小于等于num的斐波那契数且要求奇数。刚开始考虑单独写一个斐波那契数列的方法,然后while其小于num时,判断是奇数则加入和。后来看到一个更好更简洁的方法,在生成斐波那契数的同时判断是否小于num且为奇数。

  var a=0,b=0,c=1,sum=0;
  for(var i=0;c<=num;i++){                //当前值小于等于num加入for循环非常巧妙
    sum+=(c%2==1?c:0);
    a=b;
    b=c;
    c=a+b;
  }
  return sum;
}

非常巧妙,因此我想把这个方法套用到数组方法中,但是需要想一下边缘的问题。

function sumFibs(num) {
  var fib=[1,1];
  var sum=2;
  for(var i =2;fib[i-1]<num;i++){         //fib[i]此时还没有被赋值 
    fib[i]=fib[i-1]+fib[i-2];
    if(fib[i]>num){break;}                //在加sum之前判断边界
    if(fib[i]%2 !==0){sum=sum+fib[i];}
  }
  return sum;
}
sumFibs(1);                               //刚好num为1或2时返回值都是2,省去了判断

有机会想尝试测试两种方法包括最开始的想法处理速度的差别。

上一篇下一篇

猜你喜欢

热点阅读