斐波那契数列完全指南:Fibonacci 怎么算、和黄金比例的关系
从 F(n)=F(n-1)+F(n-2) 这条递推讲起,带你看清 0 1 1 2 3 5 8 13 这串数怎么来,它和黄金比例 φ 的关系,自然界里它藏在哪,以及编程里那道经典题怎么解。
斐波那契数列:一条规则、一串数、一个比例
第一次真正记住斐波那契数列,是在草稿纸上手写它的时候。我写下两个数,0 和 1,然后每写一个新数,都把前面相邻的两个加起来。结果是这样一串:0、1、1、2、3、5、8、13、21,越往后越大,却始终守着同一条规则。那一刻我才明白,这串看着复杂的数,背后只有一句话。
它的定义只有一行
斐波那契数列的规则可以写成一条递推式:
F(n) = F(n-1) + F(n-2)
意思是,第 n 项等于它前面两项之和。你只需要两个起始值就能让整条数列跑起来。用标准起始 F(0) = 0、F(1) = 1,后面的每一项都自动出现:F(2) = F(1) + F(0) = 1,F(3) = F(2) + F(1) = 2,F(4) = 3,F(5) = 5。没有任何特例,没有分情况讨论,同一条加法规则一直用到底。
一个真实的例子最直观。输入「生成前 9 项」,从 0、1 起头,得到的就是:
0 1 1 2 3 5 8 13 21
每个相邻的两数相加,正好是它右边那个:8 + 13 = 21,这就是整个数列的全部秘密。
0 1 还是 1 1,差在哪
很多人第一次卡住,是因为有的书从 0、1 开头,有的从 1、1 开头。两种写法都对,只是编号方式不同。0、1 形式是零起始的,F(0) = 0,数列读作 0、1、1、2、3。1、1 形式去掉开头的零,从 1 开始数,读作 1、1、2、3、5。它们的第 10 项都是 55,但下标整体平移了一位。做算法面试题时,先确认题目用的是哪种约定,否则很容易差一位。
它和黄金比例的关系
斐波那契最迷人的地方,是它和黄金比例 φ ≈ 1.6180339887 的关系。把任意一项除以它前一项,这个比值会一步步稳定到 φ。一开始它会来回摆:5 ÷ 3 = 1.667,接着 8 ÷ 5 = 1.6,再往后 13 ÷ 8 = 1.625。到 F(20) ÷ F(19) 时,已经准到小数点后四位。反过来,前一项除以后一项,会逼近 0.618,也就是 1 ÷ φ。
这不是巧合。φ 是方程 x² = x + 1 的正根,而斐波那契的递推恰好和这个方程同构,所以比值天然向它收敛。想自己验算这些除法,可以用科学计算器逐个比一比。
自然界里到处都是它
斐波那契不只活在纸上。向日葵的种子排成两组反向的螺旋,顺时针和逆时针的螺旋数,往往是相邻的两个斐波那契数,比如 34 和 55。松果的鳞片、菠萝的格子、雏菊的花瓣数,也常落在这串数上。植物这样排列,是因为相邻两片之间转 φ 这个比例对应的角度(约 137.5 度),能让叶子和种子彼此遮挡最少,采光和空间利用最高效。换句话说,这串数不是人类发明的审美,而是自然在解一道排布优化题时反复给出的答案。
编程里的那道经典题
「打印前 N 个斐波那契数」和「返回第 n 项」几乎是每个程序员都见过的入门题。它看着简单,却藏着两个坑。
第一个坑是递归。如果你天真地写 fib(n) = fib(n-1) + fib(n-2) 的纯递归,计算量会指数级膨胀,算到 F(40) 就慢得让人难受。正确做法是用循环或记忆化,从前往后递推,一遍就够。
第二个坑更隐蔽,是精度。JavaScript 的数字是 64 位浮点,只在 2 的 53 次方以内精确。到第 79 项 F(79),数值就超出了这条线,普通生成器会把后面每一项悄悄四舍五入,到第 100 项尾数就错了。要拿到精确的 F(100) = 354224848179261915075,必须用大整数(BigInt)来跑整条递推。我自己第一次写这道题时就栽在这儿,测试用例全过,真到大数才发现尾数对不上。
如果你只是想快速核对答案,或者批量生成一段参考输出,直接用斐波那契数列生成器就行,它用 BigInt 算,前 N 项、指定区间、第 n 项都能要,还能顺手显示累加和与相邻比值。需要更通用的等差、等比或自定义递推数列时,数列生成器能覆盖更多形式。
一条规则能走多远
回到最开始那张草稿纸。斐波那契告诉我的,是一条极简的规则可以长出极丰富的结构:它逼近黄金比例,它排进向日葵和松果,它成了算法课的第一道坎。下次你在自然里、在代码里、在试卷上再碰见 0、1、1、2、3、5,你会知道,它们全都来自同一句加法。
Made by Toolora · Updated 2026-06-13