【譯】Python中幾種實現斐波那契數列的方法

做者: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大學實用教程》 查閱。

原文連接:medium.com/future-visi…

搜索技術問答的公衆號:老齊教室

在公衆號中回覆:老齊,可查看全部文章歸類。

相關文章
相關標籤/搜索