斐波那契數列與黃金分割比以及矩陣形式推導
阿新 • • 發佈:2018-12-13
數學上,斐波那契數列以遞迴的形式進行定義
F0=0F1=1Fn=Fn−1+Fn−2F0=0F1=1Fn=Fn−1+Fn−2
注意,遞迴的形式實現較為簡單明瞭,當然在程式設計實踐時,並不推薦遞迴的實現方式,因為存在大量的重複計算,斐波那契的優化實現不是本文的重點,如有興趣,請參閱 每週一刷——從斐波那契數列到動態規劃,本文重點探討菲波那切數列與黃金分割比的關係。
維基百科中說菲波那切數列又叫黃金分割數列,這無疑是在告訴我們我們可以通過黃金分割的方式(5√−125−12)生成出來一個菲波那切數列。
下面我們簡單驗證我們的判斷:
def fib(n):
return n if n <= 1 else fib(n-1)+fib(n-2)
N = 20
print([fib(n) for n in range(N)])
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
- 1
- 2
- 3
- 4
- 5
- 6
所謂黃金分割比,一種猜想:Fn=Fn−1(1+5√−12)Fn=Fn−1(1+5−12):
int(55*(1+.618)+.5) == 89
int(2584*(1+.618)+.5) == 4181
- 1
- 2
indeed,誠哉斯言。
我們接著做如下的模擬:
def gold_fib(n):
return n if n <=2 else int(gold_fib(n-1)*(1+.618))
print([gold_fib(n) for n in range(N)])
[0, 1, 2, 3, 4, 6, 9, 14, 22, 35, 56, 90, 145, 234, 378, 611, 988, 1598, 2585, 4182]
# 已經非常接近了,
- 1
- 2
- 3
- 4
- 5
- 6
矩陣形式推導
還是從定義出發:
a0=0a1=1an=an−1+an−2a0=0a1=1an=an−1+an−2通過初等代數方法,我們也可得出此解析解 的形式,具體請參考 斐波那契數列;
def matrix_fib(n):
return int(1/sqrt(5)*(((1+sqrt(5))/2)**n-((1-sqrt(5))/2)**n))
print([matrix_fib(n) for n in range(N)])
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
# 一模一樣,不差分毫
- 1
- 2
- 3
- 4
- 5
- 6
- 7
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-8cccb36679.css" rel="stylesheet">
</div>