【问题标题】:Sum All Odd Fibonacci Numbers Part 2将所有奇数斐波那契数相加第 2 部分
【发布时间】:2020-09-02 08:26:39
【问题描述】:

我的问题

给定一个正整数 num,返回所有小于或等于 num 的奇数斐波那契数的总和。

斐波那契数列的前两个数是 1 和 1。数列中的每个附加数都是前两个数的和。斐波那契数列的前六个数字是 1、1、2、3、5 和 8。

例如,sumFibs(10) 应该返回 10,因为小于或等于 10 的所有奇数斐波那契数都是 1、1、3 和 5。

我的答案

function sumFibs(num, total = [1, 1]) {

  const n = total[total.length - 1] + total[total.length - 2];

  if(n > num){

    return total;

  }

  if(n %2 ==0){
    total.push(n);
  }

 return sumFibs(num, total);

}

sumFibs(4);

问题

它一直说超出最大调用堆栈。我很确定这是因为第二个 if 语句。知道如何解决这个问题吗?

我什至试过这个:

function sumFibs(num, total = [1, 1]) {

  const n = total[total.length - 1] + total[total.length - 2];

  if(n > num){

    return total;

  }




let x = Array.from(n);
let y = x.filter((item)=>{
  return item % 2== 0
})
total.push(...y)


 return sumFibs(num, total);

}

sumFibs(4);

【问题讨论】:

  • total.push() 不起作用?
  • 确实如此,抱歉我错过了。但是您必须计算所有斐波那契数,而不仅仅是奇数。 sum 只是奇数。
  • 有趣的一点!这使得对所有奇数求和变得更加困难。也许这最容易通过递归函数之外的reduce和过滤器来实现(如果可以从函数中获取total)hmmm
  • 函数 sumFibs(num, total = [1, 1]) { const n = total[total.length - 1] + total[total.length - 2]; if(n > num){ let answer = total.filter((item)=>{ return item % 2 == 0; }).reduce((totalII, filteredItems)=>{ return totalII + filteredItems }, 0) return答案 } total.push(n) return sumFibs(num, total); } sumFibs(4); (感觉差不多了!)
  • stackoverflow.com/questions/6037472/…时空O(1)的斐波那契,仅供参考。

标签: javascript algorithm recursion


【解决方案1】:

我终于到了,所以解释一下:

正如 Pointy 所指出的,我没有将偶数斐波那契数添加到数组中。这使数组不正确。

这需要移到最后。一旦完成了所有斐波那契计算。然后我可以过滤和减少递归函数的break out子句:

function sumFibs(num, total = [1, 1]) {

  const n = total[total.length - 1] + total[total.length - 2];

  if(n > num){

  let answer = total.filter((item)=>{
    return item % 2 != 0;
  }).reduce((totalII, filteredItems)=>{
    return totalII + filteredItems
  }, 0)

  return answer



  }

total.push(n)

 return sumFibs(num, total);

}

console.log(sumFibs(4));

console.log(sumFibs(75204));

【讨论】:

  • 我很高兴你明白了!
【解决方案2】:

作为对比,这里有一个迭代,O(1) 空格,替代:

function f(n){
  if (n < 1)
    return 0;
    
  let result = 1;
  let a = 1
  let b = 1
  
  while (b <= n){
    if (b & 1)
      result += b;
    [a, b] = [b, a + b]
  }
  
  return result;
}

console.log(f(10));
console.log(f(4));
console.log(f(75204));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2015-06-05
    • 2014-05-23
    相关资源
    最近更新 更多