piapia123
zh

斐波那契数列

生成器

所有处理都在浏览器本地完成,数据不上传服务器

输出

斐波那契数列每一项是前两项之和:0, 1, 1, 2, 3, 5, 8, 13… 下标从 0 起:F(0) = 0、F(1) = 1。 民间有两种起法 ——「F(1) = 1, F(2) = 1」与「F(0) = 0, F(1) = 1」—— 同一个「第 10 项」在两个约定下差一位。这不是小事:拿它做下标计算时差一位就是差一位。这里采用国际通用的 0 起约定(ISO 80000-2),并且每一行都把下标写出来(`F(10)`),一眼能对上是哪一种。 为什么必须用 BigInt。 F(79) 已经接近 2⁵³,F(80) 就超过了 —— 超过之后普通数字会静默丢低位:F(100) 用普通数字算出来是 354224848179262000000,正确值是 354224848179261915075。位数对、开头对,看不出任何异常。而斐波那契恰好是那种「随手算到第 100 项」的数列。 「反查」那一档用来回答另一个方向的问题:这个数在不在数列里?在的话是第几项?

功能

  • 四种查法:前 N 项、第 N 项、第 a 到第 b 项、反查某个数在第几项
  • 下标从 0 起,且每行都标出下标(`F(10)`),不会与另一种约定混淆
  • 起始两项可改(默认 0、1):填 2、1 就是卢卡斯数列(2, 1, 3, 4, 7, 11…)
  • 全程 BigInt:第 1000 项的 209 位、第 10000 项都精确
  • 反查会告诉你它落在哪两项之间(不是斐波那契数时)
  • 反查接受千分位逗号与空格
  • 区间写反了(a > b)也能用
  • 最多一次列 500 项,超出部分会如实说明还有多少
  • 结果逐行可复制

使用方法

  1. 选查法:前 N 项、第 N 项、区间,还是反查
  2. 填对应的数值
  3. 结果实时出现,点某一行的复制按钮取走一项

常见问题

F(1) 到底是 1 还是 0?
取决于你用的约定。这个工具用的是 F(0) = 0、F(1) = 1(国际标准 ISO 80000-2 的写法,也是多数编程教材的写法)。另一种常见约定是 F(1) = F(2) = 1,从 1 开始编号。两者的数列本身一模一样,只是编号错开一位。所以这里每一行都把下标写在标签里(`F(10)`),你对一下就知道自己拿到的 55 是第 10 项还是第 11 项。
为什么普通数字会算错?
因为 JavaScript 的普通数字是双精度浮点,只有 53 位有效位数:F(80) = 23416728348467685 已经超出,转成普通数字会变成 23416728348467684。更麻烦的是它不报错、不抛异常,只是悄悄少 1。这个工具全程 BigInt,任意位数都精确。
能算到第几项?
下标上限 10000 项(F(10000) 有 2090 位,是一屏放不下的大数)。限制的原因是输出:再多列下去,结果区与复制的内容都会大到没法用。反查也在这个上限内搜索 —— 超过它的数会明确告诉你「不在数列里」,而不是假装搜完了。

相关工具