斐波那契数列函数产生不正确的值

Fibonacci sequence function producing incorrect values

我正在创建一个产生意外和不准确结果的斐波那契函数。我在这里做错了什么?有没有简单的方法来纠正这个问题?

const fib=(c,f=[0,1],r=0)=>c>1?(f.push(f.reduce((a,b)=>a+b,0)),f.shift(),fib(c-1,f,1)):(r?f[1]:(c<0?NaN:f[c]));
fib(100); // -> 354224848179262000000,

// Correct 100th digit where `fib(0) === 0` would be 354224848179261915075

是的,对于大整数和非常 small/long 的小数,这是一个相当普遍的问题。当涉及到十进制数字时,有一些库可以解决这个问题,但好消息是 JavaScript 对大整数有原生支持,可以立即解决这个问题。只需使用 return BigInt 类型,数字就会准确。

不幸的是,如果不四舍五入到您提到的错误值,您就无法将此数字格式转换回正常数字,但它会很好地进行字符串化,因此它应该适用于几乎所有用途。

使用这个:

const fib=(c,f=[0n,1n],r=0)=>c>1?(f.push(f.reduce((a,b)=>a+b,0n)),f.shift(),fib(c-1,f,1)):(r?f[1]:(c<0?NaN:f[c]));

console.log(fib(100).toString()); // -> "354224848179261915075"

您可以在此处阅读有关 BigInt 类型的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt