我正在玩写一个javascript Fibonacci序列,因为我从未尝试这样做,想出了一个简单的迭代公式来计算它。然后我决定通过10000次迭代测试运行它来查看结果。令我惊讶的是,它一直工作到第1476次迭代,然后破裂了。 1477和1478都给出了结果" Infinity"。我尝试过不同的浏览器,改变显示方法,但结果却相同。
1475i - 1.3069892237633983e + 308 1476i - 无限 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>
我不确定那时候某个功能是否破裂,或者我可能没有在序列中考虑到这一点。是的,我意识到我跳过了第一个整数,但这不应该影响函数。
答案 0 :(得分:4)
第1477个Fibonacci数字太大而无法用Javascript表示。 “溢出”会导致您的号码变为Infinity
。
Infinity - 1476thFibonacciNumber
计算中, Infinity
仍为y
。
然后在下一次迭代中,您Infinity - Infinity
NaN
JavaScript
。从那时起,它一直到NaN
。
答案 1 :(得分:3)
Javascript可以处理的最大值是1.7976931348623157e + 308。如果您的代码生成大于此值的任何内容,它将会中断。
答案 2 :(得分:1)
对于N的大值,Fibonacci系列可以近似为
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
。因此,即使您再次减去最后一个数字,也不会回到“真实”数字。这就是如何处理溢出。
答案 3 :(得分:0)
关于JavaScript中Fibonacci序列的主题。 srcdoc
有一个使用生成器的好例子:
// 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)
}