1. 程式人生 > >斐波那契(fibonacci)數列與黃金分割比以及矩陣形式推導

斐波那契(fibonacci)數列與黃金分割比以及矩陣形式推導

數學上,斐波那契數列以遞迴的形式進行定義: 

                                                         

注意,遞迴的形式實現較為簡單明瞭,當然在程式設計實踐時,並不推薦遞迴的實現方式,因為存在大量的重複計算,斐波那契的優化實現不是本文的重點,如有興趣,請參閱 每週一刷——從斐波那契數列到動態規劃,本文重點探討菲波那切數列與黃金分割比的關係。

維基百科中說菲波那切數列又叫黃金分割數列,這無疑是在告訴我們我們可以通過黃金分割的方式((√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]    
                            # 一模一樣,不差分毫