1. 程式人生 > >用Python編寫斐波那契數列(Fibonacci Sequence)

用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以內所有的斐波那契數字了,而且該函式可以無限次呼叫。

斐波那契數列是一種非常有趣的數列,之所以那麼重要,讓幾乎所有的數學書都能提到,是因為無論是在數學界還是自然界,這個規律都十分重要,黃金分割在日常生活中也經常用到。這麼有趣的數列,求解方式當然不僅僅侷限於上述方法,還可以通過矩陣、線性代數遞推,線性方程,母函式等多種方法進行求解。斐波那契數列在各個學科都會出現,它的很多漂亮性質讓我們著迷,感興趣的同學不妨繼續深入探索,更好的瞭解這個有趣而且有用的數列。

這裡寫圖片描述