91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Python實現求解斐波那契數列第n項

發布時間:2022-02-22 16:44:21 來源:億速云 閱讀:395 作者:iii 欄目:開發技術

這篇文章主要介紹了如何使用Python實現求解斐波那契數列第n項的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇如何使用Python實現求解斐波那契數列第n項文章都會有所收獲,下面我們一起來看看吧。

算法一:遞歸

遞歸計算的節點個數是O(2?)的級別的,效率很低,存在大量的重復計算。

比如:

f(10) = f(9) + f(8)

f(9) = f(8) + f(7) 重復 8

f(8) = f(7) + f(6) 重復 7

時間復雜度是O(2?),極慢

def F1(n):
    if n <= 1: return max(n, 0)  # 前兩項
    return F1(n-1)+F1(n-2)  # 遞歸

算法二:記憶化搜索

開一個大數組記錄中間結果,如果一個狀態被計算過,則直接查表,否則再遞歸計算。

總共有 n 個狀態,計算每個狀態的復雜度是 O(1),所以時間復雜度是 O(n)。但由于是遞歸計算,遞歸層數太多會爆棧。

res = [None]*100000
def F2(n):
    if n <= 1: return max(n, 0)
    if res[n]: return res[n]  # 如果已存在則直接查找返回結果
    res[n] = F2(n-1)+F2(n-2)  # 不存在則計算
    return res[n]

算法三:遞推

開一個大數組,記錄每個數的值。用循環遞推計算。

總共計算 n 個狀態,所以時間復雜度是 O(n)。但需要開一個長度是 n 的數組,內存將成為瓶頸。

def F3(n):
    if n <= 1: return max(n, 0)
    res = [0, 1]
    for i in range(2,n+1):
        res.append(res[i-1]+res[i-2])
    return res[n]

算法四:遞歸+滾動變量

比較優秀的一種解法。仔細觀察我們會發現,遞推時我們只需要記錄前兩項的值即可,沒有必要記錄所有值,所以我們可以用滾動變量遞推。

時間復雜度還是 O(n),但空間復雜度變成了O(1)。

def F4(n):
    if n <= 1: return max(n, 0)
    fn, f0, f1 = 0, 1, 0  # fn為最終結果,f0為第0項,f1為第一項,
    for i in range(2, n+1):
        fn = f0 + f1  # 前兩項和
        f0, f1 = f1, fn  # 遞推變量
    return fn

算法五:矩陣乘法+快速冪

利用矩陣運算的性質將通項公式變成冪次形式,然后用平方倍增(快速冪)的方法求解第 n 項。

所以我們想要的得到An,只需要求得A?,然后取第一行第二個元素即可。

如果只是簡單的從0開始循環求n次方,時間復雜度仍然是O(n),并不比前面的快。我們可以考慮乘方的如下性質,即快速冪:

這樣只需要 logn 次運算即可得到結果,時間復雜度為 O(logn)

def mul(a, b):  # 首先定義二階矩陣乘法運算
    c = [[0, 0], [0, 0]]  # 定義一個空的二階矩陣,存儲結果
    for i in range(2):  # row
        for j in range(2):  # col
            for k in range(2):  # 新二階矩陣的值計算
                c[i][j] += a[i][k] * b[k][j]
    return c
def F5(n):
    if n <= 1: return max(n, 0)
    res = [[1, 0], [0, 1]]  # 單位矩陣,等價于1
    A = [[1, 1], [1, 0]]  # A矩陣
    while n:
        if n & 1: res = mul(res, A)  # 如果n是奇數,或者直到n=1停止條件
        A = mul(A, A)  # 快速冪
        n >>= 1  # 整除2,向下取整
    return res[0][1]

關于“如何使用Python實現求解斐波那契數列第n項”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“如何使用Python實現求解斐波那契數列第n項”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

秦安县| 崇义县| 泗水县| 凭祥市| 滦南县| 泰来县| 平定县| 尼勒克县| 留坝县| 白玉县| 苍梧县| 余江县| 巴楚县| 松溪县| 隆林| 含山县| 嘉峪关市| 三明市| 名山县| 辽阳县| 闽侯县| 韶关市| 县级市| 吉木萨尔县| 安庆市| 浙江省| 亳州市| 镇赉县| 苏尼特左旗| 宝山区| 繁峙县| 秦皇岛市| 澎湖县| 中宁县| 沈丘县| 胶南市| 皮山县| 郯城县| 阿鲁科尔沁旗| 潞城市| 神农架林区|