斐波那契(fibonacci)數列與黃金分割比以及矩陣形式推導
阿新 • • 發佈:2019-02-04
數學上,斐波那契數列以遞迴的形式進行定義:
注意,遞迴的形式實現較為簡單明瞭,當然在程式設計實踐時,並不推薦遞迴的實現方式,因為存在大量的重複計算,斐波那契的優化實現不是本文的重點,如有興趣,請參閱 每週一刷——從斐波那契數列到動態規劃,本文重點探討菲波那切數列與黃金分割比的關係。
維基百科中說菲波那切數列又叫黃金分割數列,這無疑是在告訴我們我們可以通過黃金分割的方式((√5−1)/2)生成出來一個菲波那切數列。
下面我們簡單驗證我們的判斷:
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]
int(55*(1+.618)+.5) == 89
int(2584*(1+.618)+.5) == 4181
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] # 已經非常接近了,
通過初等代數方法,我們也可得出此解析解的形式,具體請參考 斐波那契數列;
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]
# 一模一樣,不差分毫