費氏數列(Fibonacci sequence)是一個無限的有序整數列表,由 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,並且每個新值都等於前兩個值的總和。要在實務上計算這個數列,請先決定需要的項數,從兩個種子值開始,對每個 term 套用一次遞迴式,再依序寫下每個結果。對於小規模需求,用紙筆或任何計算機做幾行運算即可;不過一旦要求的項數超過大約七十幾,一般的浮點數便會開始對你關心的位數進行四捨五入,這時你必須改用精確的整數方法。一個專用的瀏覽器型 費氏數列產生器(Fibonacci Sequence Generator) 會為你處理索引、遞迴與精確的小數格式化,讓你可以請求最多一千個帶索引的項數,並在不出網頁的情況下將它們以純換行分隔的文字複製出來。

費氏數列:定義與遞迴
費氏數列使用兩個種子值和一條加法規則。種子值為 F(0) = 0 與 F(1) = 1。對於任何 2 以上的索引 n,F(n) 由前兩個值相加而得,寫成 F(n) = F(n−1) + F(n−2)。反覆套用這條規則就能得到列表中的每一個項;除了將前兩個值相加之外,沒有任何能直接算出特定 n 的公式。
這個從 0 開始的定義與 NIST 數學函數數位函式庫(Digital Library of Mathematical Functions)§24.15(iv) 所維護的紀錄一致,也是 OEIS A000045 所使用的定義。有些教科書與線上文章會從 1, 1 開始顯示其列表,那就是同一個數列只差一個索引位移。從 F(0) 出發可以讓寫在每個值旁邊的索引保持明確,這在出現像 F(1) = 1 與 F(2) = 1 這種早期的重複值時相當關鍵。
數列的前十二項如下:
| 索引 n | F(n) |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 5 |
| 6 | 8 |
| 7 | 13 |
| 8 | 21 |
| 9 | 34 |
| 10 | 55 |
| 11 | 89 |
用表格驗證規則:F(5) = F(4) + F(3) = 3 + 2 = 5,這與 F(5) 那一列吻合。這一個代入動作就是整個計算方法本身,每出現一個新索引就套用一次。
為何在 F(78) 之後精度會失效
一般的 JavaScript Number 只能在 Number.MAX_SAFE_INTEGER 以內精確表示整數,其值為 2^53 − 1 = 9,007,199,254,740,991。費氏數列很快就會越過這個界線。F(78) = 8,944,394,323,791,464 仍落在安全範圍內,但 F(79) = 14,472,334,024,676,221 已經超出此範圍,任何再以一般數值進行的運算都會開始遺失或四捨五入某些位數。
若要處理超過此範圍的項,你需要任意精度整數運算。標準做法是使用像 BigInt 這類的大整數型別,它會把每個值儲存成一串十進位數字,並以逐位數相加的方式執行加法,過程中完全不會四捨五入。費氏數列產生器正是採用這個方法:它從 current = 0n 與 next = 1n 開始,接著對每個被請求的索引,將 current 附加到輸出中,並把這對數推進為 (next, current + next)。每一次加法都是精確的整數運算,因此結果保留每一個十進位數字。
舉例來說,F(100) 會精確顯示為 354224848179261915075,這個值與 OEIS A000045 中所記錄的一致。改用閉式 Binet 公式搭配黃金比例的浮點方式,則會把這個數四捨五入,有時肉眼可見、有時不明顯,因為它倚賴的冪次與平方根在越過安全整數界線後會喪失精度。
使用費氏數列產生器來產生你的數列
若想在不寫程式碼的情況下產生一個帶索引的費氏數列清單,請開啟費氏數列產生器並依下列步驟操作:
- 在輸入欄位中輸入介於 1 到 1,000 之間的整數項數。你所鍵入的數字代表你要幾列,而不是最後一個值的索引。
- 點擊「Generate」(產生)按鈕。工具會驗證輸入、對每個被請求的項執行一次 BigInt 遞迴,並把每一列以 F(index) = value 的格式各自顯示在一行上。
- 閱讀出現在清單上方的摘要列。它會說明已產生的項數總計,以及該項數所對應的最末索引。
- 抽查幾個具代表性的值:F(0)、F(1)、F(10),以及你關心的、安全整數界線附近或之外的任何索引。
- 複製結果。使用「Copy」(複製)按鈕可將螢幕上顯示的相同換行分隔文字寫入剪貼簿,或在無法存取剪貼簿時手動選取可見文字。
作為一個小例子,請請求 12 項。摘要應會顯示「12 terms generated, final index 11」,輸出會以 F(0) = 0、F(1) = 1 與 F(2) = 1 開頭,讓你能從前幾列確認遞迴式已實際運作。
閱讀帶索引的輸出
產生器輸出中的每一列都帶有自己的索引,格式為 F(n) = value。這個索引並非可有可無的裝飾,而是區分兩個早期值的唯一方式,因為數列在開頭附近就出現了重複項。F(1) 與 F(2) 都是 1,若沒有標籤,這兩個值的位置就會變得含糊。每一列都加上索引也讓輸出可以被程式化切割,例如只要掃描相符的標籤就能取出 F(50)。
摘要列是第二個要查看的地方。它一定會顯示兩個數字:產生了幾列,以及達到的最高索引。請求一項時,只會回傳索引為 0 的那一列;請求二十項時,會回傳 F(0) 到 F(19),因此最末索引為 19。這是最常見的混淆來源,因為許多來源在描述費氏數列時是以「第 N 項」表示,而 N 從 1 開始,但本產生器全程都採用數學上從 0 開始的慣例。
如果你需要把這份清單複製到記事、程式碼或測試固件中,複製動作會寫出與畫面上所見完全相同的文字:列與列之間以換行分隔、不含千分位分隔符號、不使用科學記號、不裁切前幾項。當瀏覽器拒絕剪貼簿權限時,工具會回報這項限制,並讓產生的文字保持可見,以便你用拖曳方式選取。編輯項數會立即清掉先前的結果,因此較舊的數列不會在某個尚未處理的新輸入下仍殘留在畫面上。
輸入邊界與驗證規則
費氏數列產生器是圍繞著一項固定的 1,000 項上限所設計。之所以設有此上限,是因為 F(999) 含有數百個十進位數字;一旦超過,無論是顯示或複製都會產生極為龐大的 DOM 與剪貼簿內容負載,且完整的 indexed輸出大到必須捲動才能看完。此上限是產品效能上的限制,而非數學上的限制,數列本身是無限的。對於需要數百萬項的研究問題,合適的工具是原生支援大整數、並具備為大量數值資料設計之儲存格式的程式語言。
輸入解析器會拒絕任何不介於 1 到 1,000 之間的純十進位整數值。小數、科學記號、符號、分隔符號、零、負值、空輸入、以及超過上限的項數都會被拒絕,而不是被四捨五入或悄悄截斷。這代表像 1e3、1,000 或 −5 這類的值都不會產生結果,而這是刻意的設計:在你信任輸出之前,你應該確切知道產生器接受了什麼。要求零也會因同樣的理由被拒絕,因為那不會產生任何項。
所有的驗證、遞迴、格式化與複製動作都在目前的瀏覽器中執行。產生器不會上傳項數或數列、不會呼叫遠端數列 API、不會儲存歷史紀錄、也不需要帳號。唯一內嵌的數學主張就是那兩個種子值、加法遞迴式、從 0 開始的索引,以及已揭露的 1,000 項產品限制。若想以獨立來源驗證這些主張,NIST DLMF §24.15(iv) 與 OEIS A000045 都記錄了相同的定義與相同的關鍵值。
何時程式設計環境更為合適
瀏覽器產生器是為課程、程式碼展示或快速測試固件,產生最多一千項、單一帶索引清單的最快方式。它並非程式碼的替代品——當你需要把數列產生嵌進更大的程式、將項串流寫入檔案,或測試像 F(10,000) 或 F(1,000,000) 這類邊界案例時,請改用程式碼。針對這類工作,請使用你所選語言的大整數型別,把同樣的遞迴移植過去,再依管線其餘部分所期望的文字格式輸出結果。若想看到這個遞迴直接翻譯成使用 BigInt 的 JavaScript,使用 BigInt 在 JavaScript 中產生費氏數列(Generate a Fibonacci Sequence in JavaScript Using BigInt) 這份指南會逐步說明產生器所用的同一個迴圈,包括迭代順序與精確整數推進步驟。
若想更深入了解,請參閱 如何在 Excel 中建立費氏數列(How to Create a Fibonacci Sequence in Excel)。