【问题标题】:Fibonacci sequence function producing incorrect values斐波那契数列函数产生不正确的值
【发布时间】:2021-05-02 20:05:11
【问题描述】:

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

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

【问题讨论】:

  • 几乎不可能阅读所有减少、移位、NaN 和推入同一行的代码

标签: javascript arrays math fibonacci dynamic-arrays


【解决方案1】:

是的,对于大整数和非常小/长的十进制数来说,这是一个相当普遍的问题。当涉及到十进制数时,有一些库可以解决这个问题,但好消息是 JavaScript 原生支持大整数,可以立即解决这个问题。只需使用并返回 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

【讨论】:

  • 哇,这么简单!我实际上也尝试过使用 BigInt 并考虑过这一点,但无法让它在我的最终工作。可能是一个愚蠢的错字。感谢您的快速周转。这对我来说很好用。
猜你喜欢
  • 2016-08-26
  • 2011-12-18
  • 2015-04-25
  • 2014-03-02
  • 2017-07-08
  • 2014-05-03
  • 2015-06-05
相关资源
最近更新 更多