費波納契數列是一個以索引編號的整數列表,起始為 F(0)=0 與 F(1)=1,之後每一項等於前兩項之和,以正式方式寫作 F(n) = F(n−1) + F(n−2),其中 n ≥ 2。要產生費波納契數列,您需要三項資訊:一個起始定義、一個停止點,以及一個能在不進位的情況下處理巨大數值的方法。由 NIST DLMF §24.15(iv) 與 OEIS A000045 所採用的標準零起始定義,將前兩個值固定為 0 與 1,因此無論您從何處開始或停止,所產生的列表必定以這兩個精確的種子值開頭。停止點最適合以項數而非目標索引表示,因為向 F(0) 要求十項會得到 F(0) 到 F(9),而非 F(10)。在索引 78 之後,該方法最為關鍵,因為 JavaScript 的 Number 型別會喪失整數精確度並開始進位。可靠的產生器採用 BigInt 遞迴,將每個值寫為純十進位整數,絕不以浮點數次方取代封閉形式的 Binet 公式。費波納契數列產生器在您的瀏覽器中正好採用此方法,因此您可以產生從 F(0) 到 F(999) 的索引式列表,在摘要中驗證最後的索引,並複製整個以換行分隔的結果而無需上傳任何資料。

how to generate fibonacci sequence
依項數產生費波納契數列

產生器所使用的零起始定義

費波納契數列由兩個種子值與一條加法規則所定義。種子值為 F(0) = 0 與 F(1) = 1。對於任何不小於二的索引 n,F(n) 為 F(n−1) 與 F(n−2) 的和。這個單一規則就能產生整個索引式列表:0、1、1、2、3、5、8、13、21、34、55,如此無止境地延續下去。

部分教科書與網站從 1、1 而非 0、1 開始顯示列表,這會導致一個常見的混淆:同一個遞迴看起來像是偏移了一個位置。零起始的慣例避免了這種不一致,因為每個可見的索引都對應於產生該值的索引。NIST DLMF §24.15(iv) 與 OEIS A000045 都記錄此數列從 F(0) = 0 開始,而產生器採用相同的索引方式,因此每一行讀起來都恰好是 F(n) = 值。

逐步產生費波納契數列

  1. 開啟費波納契數列產生器,在輸入欄位中輸入介於 1 到 1,000 之間的整數項數。此項數描述您要從 F(0) 開始取得多少列。小數、負號、科學記號、分隔符、零、負值,以及超過 1,000 的項數都會被拒絕,而不是進位或默默地被截斷。
  2. 點擊 Generate 來產生數列。產生器執行迭代式 BigInt 遞迴,將每個值儲存為精確的整數,並將每個值以純十進位文字寫出,不含分隔符或指數記號。
  3. 閱讀輸出上方的摘要行。它會同時說明所產生的項數與最後的索引,因此要求 20 列時會回報「20 terms, final index F(19)」,絕不會是 F(20)。要求 1 列時只會回傳 F(0)。
  4. 抽查幾個具代表性的列是否與您預期的索引一致。在序列開頭,F(0) 應為 0,F(1) 應為 1,F(2) 應為 1,而 F(10) 應為 55。抽查最後一列可以確認最後的索引與摘要一致。
  5. 點擊 Copy 將整個以換行分隔的列表複製到剪貼簿。複製的文字與螢幕上顯示的內容相符——保留索引、不含分組分隔符、不含指數記號,且不會移除序列開頭的重複項。若瀏覽器阻擋剪貼簿存取,工具會回報此限制,並保留產生的文字於畫面上以便您手動選取。
  6. 將結果貼到筆記檔、程式碼註解、測試資料或試算表中。編輯項數會清除先前的輸出,因此未處理的輸入絕不會讓舊列表殘留在新列表的下方。

若您想要手動的計算範例,F(8) 能清楚地展示遞迴:F(6) = 8 且 F(7) = 13,因此 F(8) = F(7) + F(6) = 13 + 8 = 21。這個簡單的加法正好對應產生器為每個所要求的項所執行的運算。

為何 BigInt 算術對巨大的費波納契數值至關重要

浮點數運算在費波納契數上很快就會失效。JavaScript 的 Number 型別只能精確表示到 Number.MAX_SAFE_INTEGER 為止的整數,其值為 2^53 − 1 = 9,007,199,254,740,991。費波納契值 F(79) 已經超過此上限,因此任何使用純 Number 算術的程式從索引 79 開始就會開始掉位數,並在之後默默地進位。使用黃金比例次方的封閉式表達式(例如 Binet 公式)更為敏感,因為進位會在浮點數運算中累積放大。

產生器將每個值儲存為 BigInt,並透過遞迴 F(n) = F(n−1) + F(n−2) 推進 (current, next) 這一對數值,藉此同時迴避上述兩個問題。BigInt 加法會保留每一個十進位數,而轉換為文字的動作每項只發生一次,不會被串接到浮點數運算中。這就是為什麼 F(100) 能精確地顯示為 354224848179261915075,而非以近似值或指數字串表示,以及為什麼完整一千項輸出的邊界測試會將 F(999) 視為精確整數進行檢查。同樣的方法適用於課堂規模、程式設計範例,以及包含任意巨大費波納契值的測試資料。

一千項的上限是基於產品效能的邊界,而非數列本身的數學上限。F(999) 含有數百個十進位數,完整的索引式輸出大到必須捲動才能瀏覽。設定固定上限能防止意外產生龐大的 DOM 與剪貼簿內容,同時仍涵蓋課堂作業、展示、測試資料,以及許多程式設計範例。若需要數百萬項或專門的數論分析,專用的程式設計環境與為批次資料設計的儲存格式會是更合適的工具。

輸出的樣貌

您輸入的項數工具回傳的範圍顯示的摘要
1F(0)1 term, final index F(0)
5F(0) through F(4)5 terms, final index F(4)
10F(0) through F(9)10 terms, final index F(9)
20F(0) through F(19)20 terms, final index F(19)
1000F(0) through F(999)1000 terms, final index F(999)

每列先顯示其索引,即使序列前端的值重複,仍能保持每個位置的明確性。輸出頂端的摘要行必定同時回報您所要求的項數與所產生的最後索引,因此輸入與結果之間的對應關係絕不會需要靠猜測。驗證、加法、格式化與複製皆在本機端執行,產生器不會儲存歷史紀錄、不會建立帳號資料、不會呼叫數列 API,也不會載入遠端的數值表格。

將產生的數列應用於實務

帶有索引的費波納契列表擁有的實際用途比其名聲所暗示的更為多元。程式設計教學會使用前二十項來示範迴圈、記憶化與 BigInt 算術。任意精度函式庫的測試資料會納入中段與極端的值(例如 F(100) 或 F(500)),以驗證不會掉任何位數。數學課堂會將前五十列貼入學習單,讓學生與黃金比例比較其比值。程式碼審查者會在 pull-request 註解中放入一段短列表,以已知的參考值展示遞迴實作的正確性。

針對試算表,Excel 中的費波納契數列指南展示了如何將同一個零起始列表轉換為一欄公式,這在您想要一個會隨著工作表更新的即時數列時非常實用。對於需要與產生器相同 BigInt 保證的手寫程式碼,JavaScript BigInt 逐步說明將同一個迭代配對對應到一個簡短的腳本中。上述任何用途都不需要上傳資料,這正是產生器的每一步都在當前瀏覽器中執行,而非透過遠端 API 的原因,而且您輸入的項數絕不會離開這個頁面。