嗨所以我试图找到所有偶数Fibonacci数的总和,其值不超过4百万,结果我得到的不断返回无穷大......如果有人能在JS代码中找到错误我写的我非常感谢您的反馈!提前谢谢!
(“problem_2_range”已在我的HTML中定义为4000000)
var evenFibonacciSum = function() {
var sum = 0;
var arr = [1, 2];
for (i = 2; i<=document.getElementById("problem_2_range").value; i++) {
var fib = arr[i-2] + arr[i-1];
arr.push(fib);
}
for (i=0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
sum += arr[i];
} else {
continue;
}
}
document.getElementById("answer2").innerHTML = sum;
}
答案 0 :(得分:0)
答案 1 :(得分:0)
这取决于你的“价值”是什么意思。如果你的意思是Fibonacci函数的结果(例如:你用Fibonacci得到的55(10))那么它是可行的,当然,因为总和不能超过(x *(x + 1))/ 2 = 8,000,002,000,000小于2 ^ 53(Number
对象被定义为IEEE-754“double”)。
计算实际的Fibonacci函数是非常昂贵的,我会用Binet公式检查幅度,但我可以告诉你,斐波那契(34)的结果已经超过4,000,000。
如果,另一方面你想要第n个斐波那契数n不超过4,000,000让我告诉你斐波纳契(3999999)〜1.0058e835950。
使用快速biginteger库(Math.js中的那个不是很快)可以通过使用矩阵求幂技巧来实现(大概如(伪代码)
fibonacci(n){
i = n -1, t = 0;
/*
| 1 0 |
matrix = | 0 1 |
*/
a = 1, b = 0, c = 0, d = 1;
while (i > 0) {
if(i % 0x1){
t = d*(a + b) + c*b;
a = d*b + c*a;
b = t;
}
t = d*(2*c + d);
c = c*c + d*d;
d = t;
i >>>= 1;
}
t = a + b;
return t;
}
对f(n <79)
使用以下线性算法可能更快function fb(n){
var i = 1, j = 0, k, l;
for (k = 1; k <= n; k++) {
l = i + j;
i = j;
j = l;
}
return j;
}