繁体   English   中英

将所有奇数斐波那契数相加第 2 部分

[英]Sum All Odd Fibonacci Numbers Part 2

我的问题

给定一个正数 integer 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);

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

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

这需要走到最后。 一旦完成了所有斐波那契计算。 然后我可以过滤并减少递归 function 的中断子句:

 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));

相比之下,这是一个迭代的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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM