費波納契數列是一個以遞迴定義的整數序列,其中 F(0) = 0、F(1) = 1,且對於每個 n ≥ 2 都有 F(n) = F(n−1) + F(n−2),產生的數值依序為 0、1、1、2、3、5、8、13、21、34、55、89、144、……,並無限地延續下去。除了前兩項之外,每一項都是前兩項的和,而這條單一的規則就足以決定整個無限序列。本定義所使用的零基索引與美國 NIST 數學函數數位圖書館(§24.15(iv))以及 OEIS A000045 中的條目一致,兩者都將 F(0) = 0 與 F(1) = 1 視為唯一的種子值。部分教科書會將可見的列表從「1, 1」開始顯示,而非「0, 1」,但那種顯示方式其實只是同一序列偏移了一個索引而已。由於每個數值都是兩個精確整數的相加結果,因此在寫出這個序列時既不需要四捨五入、也不需要近似值或浮點數表示式;每一個新產生的項都是一個精確的整數,其十進位數字可以被儲存並重現。正因為具備這樣的特性,一個實用的費波納契數列產生器才會成為日常有用的工具:只要輸入少量的數值,就能產生從 F(0) 開始直到所選上限、精確且帶有索引的十進位整數列表,方便複製到筆記、程式碼或教學教材中使用。

驅動整個序列的零基定義
費波納契數列的數學概念建立在三個敘述之上:兩個種子值與一條規則。種子值將前兩個值固定為 F(0) = 0 與 F(1) = 1,而規則則規定,對於任何索引 n ≥ 2,F(n) 等於它前面兩個值的和。套用一次規則,可得 F(2) = F(1) + F(0) = 1 + 0 = 1。再套用一次,則 F(3) = F(2) + F(1) = 1 + 1 = 2。以此方式繼續,可得 F(4) = F(3) + F(2) = 2 + 1 = 3,而 F(5) = F(4) + F(3) = 3 + 2 = 5。每一步都使用相同的加法,而且每一步都會產生一個精確的整數,因為在加法下封閉的整數集合,其結果仍然是整數。同一份 NIST DLMF 中關於費波納契數與盧卡斯數的條目,以及同一份 OEIS A000045 紀錄,都將 F(0) = 0 與 F(1) = 1 視為規範的起點,這也就是為什麼任何遵守標準定義的產生器,其輸出的開頭都是這兩個值,而非「1, 1」。
這個遞迴關係還有另一個值得注意的微妙結果:它從不依賴涉及黃金比例的閉合形式表示式。閉合形式公式透過將一個常數取 n 次方並除以一個平方根來計算費波納契數值,能產生相當良好的近似值,但對於較大的值會進行四捨五入,因為浮點數的精度有其限制。使用精確整數運算的遞迴方式則完全避開了這種四捨五入。一個逐步建構序列的工具會將 F(100) 寫成 354224848179261915075,並將 F(999) 寫成一個數百位數的十進位數字,既不會使用科學記號,也不會遺漏任何位數。因此,這個概念不僅僅是模式識別的趣味展示;它同時也是一個實際可行的示範,說明只要數值序列可能成長到超出一般數值型別的安全範圍,精確運算就至關重要。
如何逐步產生一份帶有索引的費波納契數列表
若要把這個概念轉化為一份具體且帶有索引的列表,可以使用 費波納契數列產生器,它會在瀏覽器中本地執行每一次加法,並接受單一整數作為輸入。其確切的操作步驟如下:
- 在計數欄位中輸入 1 到 1,000 之間的整數項數;該計數包含 F(0),因此輸入 1 表示只要求 F(0)。
- 產生序列,並查看摘要同時確認已產生的項數與最後一個索引,以便將輸出與所要求的計數進行比對。
- 檢視摘要中具代表性的索引值(例如第一列、中間列與最後一列),以驗證遞迴確實產生了預期的 F(0)、F(1) 與最終項。
- 使用複製動作複製以換行符分隔的列表;若目前瀏覽器無法存取剪貼簿,則可手動選取可見的文字。
- 當需要更長或更短的列表時,可將計數修改為不同的數值;先前的結果會被清除,這樣舊的序列就不會在尚未處理的新輸入下殘留在畫面上。
您所輸入的計數與所收到的列數之間的對應關係是固定的,而且很容易從摘要行加以驗證。下表彙整了最常見的計數輸入及其對應的結果範圍。
| 輸入的項數 | 回傳的列數 | 輸出中的最後索引 |
|---|---|---|
| 1 | 僅 F(0) | 0 |
| 10 | F(0) 到 F(9) | 9 |
| 20 | F(0) 到 F(19) | 19 |
| 100 | F(0) 到 F(99) | 99 |
| 1000 | F(0) 到 F(999) | 999 |
由於每一列都帶有其索引,即使是前面重複的 F(1) = 1 與 F(2) = 1 也不會被互相混淆;位置本身就是輸出的一部分,而不是留給讀者自行推斷的資訊。
為何 BigInt 遞迴優於閉合形式運算
JavaScript 內建的 Number 型別只能精確地表示整數到某個固定的上限,超過該上限後,算術運算便會四捨五入到最接近的可表示雙精度浮點數。第一個跨越這個界限的費波納契值在序列中出現得非常早:F(79) 已經大於 Number.MAX_SAFE_INTEGER,而這個安全整數上限落在費波納契數列(經常被當作程式設計範例)的小索引範圍內。任何以一般數值儲存費波納契值的產生器,都會在 F(79)、F(80) 以及之後所有項中默默地喪失精度,即使遞迴本身產生的仍是完全精確的整數。
費波納契數列產生器透過將每個值儲存為 BigInt 並直接轉換為十進位文字,避開了這個陷阱。BigInt 是任意精度的整數型別,因此其加法運算所產生的十進位數字,與手動進行長乘法所得到的結果相同。因此 F(100) 會呈現為 354224848179261915075,而不是 3.542248481792619e+20,也不會是浮點數四捨五入後截斷的整數。該演算法每個要求的項只執行一次加法,並且從不採用涉及 φ 的閉合形式表示式,這表示透過反覆的乘方與平方根運算,捨入誤差絕不會累積。對於想要複製一份乾淨、可索引的費波納契數列表以用於程式範例、測試資料或課堂展示的讀者而言,正是 BigInt 遞迴保證了所顯示的位數就是 F(n) 真正的位數。
輸入規則、拒絕條件與一千項的上限
輸入欄位僅接受純粹的十進位整數文字。低於 1 的計數、高於 1000 的計數、小數、科學記號、符號、分隔符號以及空白的提交,都會被拒絕,而非被四捨五入或默默地限制上限。此上限並非對數學序列本身(其為無限)的陳述,而是產品效能上的界線,用以避免所產生與複製的文字意外地產生極為龐大的 DOM 負載或剪貼簿傳輸量。F(999) 包含數百個十進位數字,而一份完整的、含一千項的索引列表,其大小在任何合理的視窗中都需要捲動才能完整檢視。
語意上的計數方式也值得稍加說明:輸入的是項數,而非目標值,也非最後一個索引。輸入 10 表示要求十列,即 F(0) 到 F(9);它並非要求 F(10)。摘要永遠會同時列出已產生的項數與最後一個索引,這消除了習慣從 1 開始編號陣列的程式語言使用者容易遇到的歧義。對於需要數百萬項或進行專門數論分析的工作而言,配備大量資料儲存功能的專屬程式設計環境,會比任何單一頁面的瀏覽器工具更為合適;而此上限的存在,正是為了讓這個小工具在它所設計的課堂規模與展示規模任務中保持流暢。
一份精確且帶索引的序列有何用途
一份精確且帶索引的費波納契數列表,會在許多相關的場景中出現:作為驗證遞迴實作的單元測試 fixture、作為區分零基與一基索引差異的教學參考、作為比較任意精度函式庫的輸入資料,以及作為筆記或簡報中可快速複製貼上的小區塊。費波納契數列產生器相當適合上述每一種用途,因為其輸出維持在純粹的十進位格式、每一列都自帶索引,而且在計算過程中並不會將計數或產生的序列傳送至遠端伺服器。
同樣值得說明的是,這個工具不會做的事情。它不會測試某個任意的獨立數字是否屬於這個序列、不會將費波納契值分解為質因數、不會單獨列出質數索引或質數值的項、不會計算連續的比例來估計黃金比例、不會繪製螺旋圖,也不會主張可見列表中的任何模式可以證明關於自然或財務的論點。它只會產生由兩個種子值與加法遞迴所定義的序列,不多也不少。這樣的範圍讓輸出得以保持可驗證、可重現,並且不含任何本身需要另行論證的詮釋,也讓需要索引化十進位序列本身的任何任務,都擁有一份乾淨的資源可以使用。
若想進一步了解,請參閱 使用 Verilog 程式碼產生費波納契數:測試資料。
若想進一步了解,請參閱 運用費波納契數列將英里轉換為公里。