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

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

						數學上,斐波那契數列以遞迴的形式進行定義
F0=0F1=1Fn=Fn1+Fn2F0=0F1=1Fn=Fn−1+Fn−2

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

維基百科中說菲波那切數列又叫黃金分割數列,這無疑是在告訴我們我們可以通過黃金分割的方式(5125−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=Fn1(1+512)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=an1+an2a0=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>