我正在浏览Odin项目,其中一部分是在Euler项目中进行问题1-3。我对问题2感到难过: "通过考虑Fibonacci序列中值不超过四百万的项,找到偶数项的总和。"
我很沮丧!我究竟做错了什么?这是我到目前为止所拥有的。谢谢!
function f() {
var fib = [];
fib.push(1,2,3);
var i = fib.length;
var total = 0;
while(fib[i] < 4000000) {
var x = fib[i-2] + fib [i-1];
if(x % 2 == 0) {
total += x;
}
} return total;
}
console.log(f());
答案 0 :(得分:1)
斐波那契序列从cat .\file | %{
if($_ -match "..."){
$_ -replace "...", '...'
}
else{
$_ -replace ".*", ""
}
}
开始,而不是1, 1, 2
。
此外,您的解决方案看起来会起作用,但您将序列中的每个数字存储而不是仅存储最后两个数字,因此这将相对地吞噬内存。
答案 1 :(得分:1)
作为@DLeh notes,斐波纳契序列以1,1,2开始 - 而不是1,2,3。但是,这并没有改变对偶数值项进行求和的结果。你遇到的问题是:
while(fib[i] < 4000000) {
fib[i]
是undefined
,因此函数会立即退出,总数保持为0.同样在while循环中,您不会将序列中的下一个项目推送到数组中。以下代码修复了这两个问题:
function f() {
var fib = [];
fib.push(1,1);
var i = fib.length;
var total = 0;
while(fib[i-1] < 4000000) {
var x = fib[i-2] + fib [i-1];
fib.push(x);
i = fib.length;
if(x % 2 == 0) {
total += x;
}
} return total;
}
console.log(f()); //4613732
@DLeh还指出您存储的数字超过了所需的数量,此解决方案无需使用数组即可运行:
function f() {
var f1 = 1;
var f2 = 1;
var total = 0;
while (f2 < 4000000) {
var t = f1 + f2;
if (t % 2 == 0)
total += t;
f1 = f2;
f2 = t;
}
return total;
}
console.log(f()); //4613732
答案 2 :(得分:1)
只是为了咧嘴笑,请注意,您可以在不使用%
和+
操作的情况下解决此问题。序列中的每三个值都是偶数。也就是说,2
之后是3
(奇数),然后3 + 2
是5
(奇数),但是这两个奇数之和使我们回到偶数( 8
)并且循环重复。
因此:
function evenFibTotal(limit) {
var a = 1, b = 1, c = 2, total = 0;
while (c < limit) {
total += c;
a = b + c;
b = a + c;
c = a + b;
}
return total;
}
在每次迭代中,第二个尾随值被设置为序列中的下一个值(b + c
),并且加上当前值是第一个尾随值,最后下一个偶数Fibonacci数是总和那两个。
(也有封闭的解决方案,但这并不好玩:)