我正在尝试编写JavaScript斐波那契数列,因为我从未尝试过这样做,想出了一个简单的迭代公式来计算它。然后我决定通过执行 10000 次迭代来测试运行它以查看结果。令我惊讶的是,它一直工作到 1476 次迭代,然后坏了。1477年和1478年都给出了"无穷大"的结果。我尝试了不同的浏览器,更改了显示方法,但最终得到了相同的结果。
1475i - 1.3069892237633983e+3081476i - 无限1477i - 无限1478i - NaN
使用的代码:
<!DOCTYPE html><html><head><script>
function fibonacci(){
var x = 1;
var y = 0;
for(i=0;i<1478;i++){
var box = document.createElement('div');
box.setAttribute('id','box'+i);
document.body.appendChild(box);
document.getElementById('box'+i).innerHTML = [i] + 'i - ' + x;
x = x + y;
y = x - y;
}
}
</script></head><body onLoad="fibonacci();"><div id="output"></div></body></html>
我不确定函数是否在某个点中断,或者我在序列中可能没有考虑到什么。是的,我意识到我跳过了第一个整数,但这应该不会影响函数。
第 1477 个斐波那契数太大,无法用 Javascript 表示。"溢出"会导致您的号码变得Infinity
。
Infinity - 1476thFibonacciNumber
在以下y
计算中仍Infinity
。
然后在下一次迭代中,您将Infinity - Infinity
JavaScript
中NaN
。从那一刻起,它一直NaN
到最后。
Javascript 可以处理的最大值是 1.7976931348623157e+308。如果你的代码生成任何大于此值的内容,它就会中断。
对于 N 的大值,斐波那契级数可以近似为
F(N) = math.pow(phi, N) / math.sqrt(5)
(参考: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html#fibround (
其中phi
是黄金比例:(sqrt(5(+1(/2
您现在可以计算出可以使用以下内容计算的最大斐波那契数是多少:
phi = (math.sqrt(5)+1)/2
fibMax = math.floor(log(1.79769)/log(phi) + math.log(math.sqrt(5)))
上面的答案是... 1475
- 这是您能够在没有溢出的情况下计算的最大数字。
底线 - 一旦您的计算溢出,它将继续这样做。 Infinity + anything = Infinity
,有趣的是Infinity - anything = still infinity
。和infinity + infinity = NaN
.因此,即使您再次减去最后一个数字,您也不会回到"真实"数字。这就是处理溢出的方式。
关于 JavaScript 中的斐波那契数列。MDN有一个使用生成器的很好的例子:
// Declare generator
function* fibonacci() {
let n0;
let n1 = 0
let n2 = 1
while (true) {
n0 = n1
n1 = n2
n2 = n0 + n1
yield n0
}
}
// Create generator
var y = fibonacci()
// Print them out
for (let x = 0; x < 1477; x++) {
console.log(x + 1, " ", y.next().value)
}