做者:Elliott Saslow算法
翻譯:老齊bash
與本文相關的圖書推薦:《Python大學實用教程》《跟老齊學Python:輕鬆入門》markdown
衆所周知,斐波那契數列是一種很是重要的數列。函數
0,1,1,2,3,4,8,13,21,34,55,...
複製代碼
用遞歸的方式,能夠這樣定義斐波那契數列:oop
按照上面的公式,能夠用Python語言直接寫出實現它的函數:測試
def fib_recursive(n): if n == 0: return 0 if n == 1: return 1 else: return(fib_recursive(n-1)+fib_recursive(n-2)) 複製代碼
無論何時,咱們遇到某個算法的實現,總要問一問下面的問題:spa
如今,無需深刻了解具體細節,用遞歸方式,屬於貪心算法,須要花費大量計算步驟來完成。所以,讓咱們嘗試使用列表來完成此操做,下面的方法能夠加快處理速度並簡化計算。翻譯
def fib_poly(n): #注意0 if n == 0: return 0 #用列表保存數值 else: f = np.zeros(n+1) f[0] = 0 f[1] = 1 for i in range(2,n+1): f[i] = f[i-1] + f[i-2] return f[n] 複製代碼
Ok,來看看它的表現。下圖顯示了執行上面兩個函數的所用時間比較。3d
哇!注意觀察它們所用時間的差異!後面這個函數比前面的遞歸方法快多了。code
下面的圖示中很明顯地表示了兩者執行時間的差別。
哇! 使人難以置信,遞歸竟然如此慢。還有更快的方法呢? 應該有:
以下所示,能夠用矩陣的方法計算斐波那契數列,會更快。
import numpy as np def fib_matrix(n): Matrix = np.matrix([[0,1],[1,1]]) vec = np.array([[0],[1]]) return np.matmul(Matrix**n,vec) 複製代碼
這真的很酷,在整個測試過程當中,矩陣算法在幾乎恆定的時間內執行。關於用矩陣實現斐波那契數列的方法,能夠參考 《跟老齊學Python:數據分析》 ,書中有相關說明。
注: 此外,斐波那契數列還可以用生成器、迭代器方式實現,這些實現方法,能夠到 《Python大學實用教程》 查閱。
搜索技術問答的公衆號:老齊教室
在公衆號中回覆:老齊,可查看全部文章歸類。