最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)求解斐波那契第n項的解法(包括矩陣乘法+快速冪)

 更新時間:2021年04月15日 10:32:45   作者:owry5  
這篇文章主要介紹怎么使用Python求解斐波那契第n項,方法多樣,邏輯清晰,代碼簡單詳細,有這方面需要的朋友可以參考下

斐波那契數(shù)列

首先我們來定義一下斐波那契數(shù)列:

這里寫圖片描述

即數(shù)列的第0項:

這里寫圖片描述

算法一:遞歸

遞歸計算的節(jié)點個數(shù)是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)  # 遞歸

算法二:記憶化搜索

開一個大數(shù)組記錄中間結(jié)果,如果一個狀態(tài)被計算過,則直接查表,否則再遞歸計算。

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

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

算法三:遞推

開一個大數(shù)組,記錄每個數(shù)的值。用循環(huán)遞推計算。

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

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]

算法四:遞歸+滾動變量

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

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

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

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

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

先說通式:

這里寫圖片描述

利用數(shù)學歸納法證明:

這里的a0,a1,a2是對應斐波那契的第幾項

這里寫圖片描述

證畢。

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

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

這里寫圖片描述

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

def mul(a, b):  # 首先定義二階矩陣乘法運算
    c = [[0, 0], [0, 0]]  # 定義一個空的二階矩陣,存儲結(jié)果
    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是奇數(shù),或者直到n=1停止條件
        A = mul(A, A)  # 快速冪
        n >>= 1  # 整除2,向下取整
    return res[0][1]

總的來說不是很難,適合擴展思路。更多關于Python的資料請關注腳本之家其它相關文章!希望大家以后多多支持腳本之家!

相關文章

  • Python生態(tài)圈圖像格式轉(zhuǎn)換問題(推薦)

    Python生態(tài)圈圖像格式轉(zhuǎn)換問題(推薦)

    在Python生態(tài)圈里,最常用的圖像庫是PIL——盡管已經(jīng)被后來的pillow取代,但因為pillow的API幾乎完全繼承了PIL,所以大家還是約定俗成地稱其為PIL。這篇文章主要介紹了Python生態(tài)圈圖像格式轉(zhuǎn)換問題,需要的朋友可以參考下
    2019-12-12
  • Python命令啟動Web服務器實例詳解

    Python命令啟動Web服務器實例詳解

    這篇文章主要介紹了Python命令啟動Web服務器實例詳解的相關資料,需要的朋友可以參考下
    2017-02-02
  • pandas如何靈活增加新的空字段

    pandas如何靈活增加新的空字段

    這篇文章主要介紹了pandas如何靈活增加新的空字段問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python用海龜繪圖寫貪吃蛇游戲

    python用海龜繪圖寫貪吃蛇游戲

    這篇文章主要為大家詳細介紹了python用海龜繪圖寫貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Python Queue模塊詳解

    Python Queue模塊詳解

    這篇文章主要介紹了Python Queue模塊詳解,需要的朋友可以參考下
    2014-11-11
  • Python實現(xiàn)輕松防止屏幕截圖的技巧分享

    Python實現(xiàn)輕松防止屏幕截圖的技巧分享

    屏幕截圖是一種常見的用于記錄信息或者監(jiān)控用戶活動的方法,為了保護隱私和數(shù)據(jù)安全,可以通過使用Python編寫一些防護措施來防止他人截取我們的屏幕,下面我們就來學習一下有哪些具體操作吧
    2023-12-12
  • python抓取多種類型的頁面方法實例

    python抓取多種類型的頁面方法實例

    在本篇文章里小編給大家整理的是關于python抓取多種類型的頁面方法實例內(nèi)容,有需要的朋友們可以學習下。
    2019-11-11
  • python安裝scipy的方法步驟

    python安裝scipy的方法步驟

    在本篇文章里小編給各位分享了關于python怎么安裝scipy的具體方法和實例代碼,需要的朋友們學習下。
    2019-06-06
  • python list等分并從等分的子集中隨機選取一個數(shù)

    python list等分并從等分的子集中隨機選取一個數(shù)

    這篇文章主要介紹了python list等分并從等分的子集中隨機選取一個數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Python命名空間namespace及作用域原理解析

    Python命名空間namespace及作用域原理解析

    這篇文章主要介紹了Python命名空間namespace及作用域原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06

最新評論

陇西县| 图木舒克市| 唐河县| 镇雄县| 房产| 岳普湖县| 滦平县| 稷山县| 玉林市| 酉阳| 册亨县| 类乌齐县| 盐池县| 莱芜市| 马鞍山市| 鄂温| 闽清县| 德保县| 托里县| 柏乡县| 安福县| 萨嘎县| 孟连| 同德县| 敦煌市| 嘉义市| 哈尔滨市| 边坝县| 新宁县| 左权县| 元阳县| 济南市| 容城县| 罗田县| 墨竹工卡县| 梁山县| 绥中县| 蓬安县| 维西| 临安市| 南雄市|