用Python編寫斐波那契數列(Fibonacci Sequence)
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞迴的方法定義:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波那契數列都有直接的應用,美國數學會從1963起專門出版了以《斐波那契數列季刊》為名的一份數學雜誌,用於專門刊載這方面的研究成果。
這個數列從第3項開始,每一項都等於前兩項之和。
假設我們編寫一小段Python程式碼來實現斐波那契數列:
fibs = [0,1]
for i in range(8):
fibs.append(fibs[-2]-fibs[-1])
print(fibs)
執行後,fibs會包含斐波那契數列的前10個數字:
[0, 1, -1, 2, -3, 5, -8, 13, -21, 34]
當然,如果想得到任意多個數字,可以加入int(input())來設定數字,作為動態範圍的長度使用,從而改變for語句塊中迴圈次數:
fibs = [0,1]
num = int(input('你想得到多少斐波那契數字?'))
for i in range (num-2):
fibs.append(fibs[-2]+fibs[-1])
print(fibs)
執行,顯示下圖第一行,輸入數字10,得到和上圖同樣的結果:
你想得到多少斐波那契數字?10
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
當然,程式設計師都是一幫很懶的傢伙,不是說他們從不做事,而是從來不喜歡做無用功。這次大家得到了10個斐波那契數字,那下一次如果需要二十個,難道他們再把這段程式碼輸入一遍?OK,如果你有耐心可以再輸一遍,但是程式設計師可不會這麼幹。
程式設計師會怎麼做呢?先定義一個斐波那契數列的函式,以後每次需要用到這個函式的時候,直接呼叫即可。
所以,假如我們先生成一個fibo.py的檔案,輸入:
def fib(n): #定義到n的斐波那契
a,b = 0,1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib2(n): #返回到n的斐波那契數列
result = []
a, b =0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
將檔案儲存到python.exe檔案的同一目錄下,比如我的.py檔案都放在C:\Users\Administrator\AppData\Local\Programs\Python\Python36,開啟Python直譯器,即Python IDLE,輸入:
>>> import fibo
>>> fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fib2(1000)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
>>>
當然,為了資料夾的規整,你可以將fibo.py這個檔案單獨放到一個空資料夾中, 比如我新建了一個C:\Users\Administrator\AppData\Local\Programs\Python\Python36\fibonacci,需要注意的是,為了在import的時候可以找到fibo.py這個檔案,必須在fibonacci這個資料夾中建立一個init.py的空資料夾才可以執行(init前面有兩個_):
>>> import fibonacci.fibo
>>> f=fibonacci.fibo
>>> f.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> f.fib2(1000)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
>>>
這樣,我們就可以順利地找到1000以內所有的斐波那契數字了,而且該函式可以無限次呼叫。
斐波那契數列是一種非常有趣的數列,之所以那麼重要,讓幾乎所有的數學書都能提到,是因為無論是在數學界還是自然界,這個規律都十分重要,黃金分割在日常生活中也經常用到。這麼有趣的數列,求解方式當然不僅僅侷限於上述方法,還可以通過矩陣、線性代數遞推,線性方程,母函式等多種方法進行求解。斐波那契數列在各個學科都會出現,它的很多漂亮性質讓我們著迷,感興趣的同學不妨繼續深入探索,更好的瞭解這個有趣而且有用的數列。