濮阳杆衣贸易有限公司

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

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

熱門標簽:電話機器人貸款詐騙 京華圖書館地圖標注 佛山通用400電話申請 看懂地圖標注方法 淮安呼叫中心外呼系統(tǒng)如何 打印谷歌地圖標注 電話外呼系統(tǒng)招商代理 廣東旅游地圖標注 蘇州人工外呼系統(tǒng)軟件

斐波那契數(shù)列

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

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

算法一:遞歸

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

比如:

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

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

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

時間復(fù)雜度是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)的復(fù)雜度是 O(1),所以時間復(fù)雜度是 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),所以時間復(fù)雜度是 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),遞推時我們只需要記錄前兩項的值即可,沒有必要記錄所有值,所以我們可以用滾動變量遞推。

時間復(fù)雜度還是 O(n),但空間復(fù)雜度變成了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ù)學(xué)歸納法證明:

這里的a0,a1,a2是對應(yīng)斐波那契的第幾項

證畢。

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

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

這樣只需要 logn 次運算即可得到結(jié)果,時間復(fù)雜度為 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]

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

您可能感興趣的文章:
  • Python:合并兩個numpy矩陣的實現(xiàn)
  • python實現(xiàn)由數(shù)組生成對稱矩陣
  • Python 如何求矩陣的逆
  • python用分數(shù)表示矩陣的方法實例
  • Python numpy大矩陣運算內(nèi)存不足如何解決
  • Python計算矩陣的和積的實例詳解
  • python 如何將兩個實數(shù)矩陣合并為一個復(fù)數(shù)矩陣

標簽:中山 湖州 呼和浩特 股票 畢節(jié) 衡水 駐馬店 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Python實現(xiàn)求解斐波那契第n項的解法(包括矩陣乘法+快速冪)》,本文關(guān)鍵詞  Python,實現(xiàn),求解,斐波,那契,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python實現(xiàn)求解斐波那契第n項的解法(包括矩陣乘法+快速冪)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python實現(xiàn)求解斐波那契第n項的解法(包括矩陣乘法+快速冪)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    达日县| 诏安县| 太保市| 黑龙江省| 白山市| 肥城市| 井研县| 阳山县| 老河口市| 富锦市| 丘北县| 闽侯县| 石嘴山市| 绿春县| 乌兰浩特市| 蓬安县| 东乡| 海门市| 阿巴嘎旗| 清镇市| 石阡县| 得荣县| 东乡族自治县| 阳江市| 富民县| 札达县| 页游| 黑龙江省| 广德县| 新泰市| 沈阳市| 东辽县| 琼海市| 锦州市| 临高县| 义乌市| 吴川市| 西林县| 白玉县| 万源市| 那坡县|