亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

斐波那契數(shù)列

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

這里寫圖片描述

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

這里寫圖片描述

算法一:遞歸

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

比如:

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

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

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

時(shí)間復(fù)雜度是O(2ⁿ),極慢

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

算法二:記憶化搜索

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

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

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)  # 不存在則計(jì)算
    return res[n]

算法三:遞推

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

總共計(jì)算 n 個(gè)狀態(tài),所以時(shí)間復(fù)雜度是 O(n)。但需要開一個(gè)長(zhǎng)度是 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]

算法四:遞歸+滾動(dòng)變量

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

時(shí)間復(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項(xiàng),f1為第一項(xiàng),
    for i in range(2, n+1):
        fn = f0 + f1  # 前兩項(xiàng)和
        f0, f1 = f1, fn  # 遞推變量
    return fn

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

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

先說(shuō)通式:

這里寫圖片描述

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

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

這里寫圖片描述

證畢。

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

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

這里寫圖片描述

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

def mul(a, b):  # 首先定義二階矩陣乘法運(yùn)算
    c = [[0, 0], [0, 0]]  # 定義一個(gè)空的二階矩陣,存儲(chǔ)結(jié)果
    for i in range(2):  # row
        for j in range(2):  # col
            for k in range(2):  # 新二階矩陣的值計(jì)算
                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]]  # 單位矩陣,等價(jià)于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]

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

相關(guān)文章

  • python實(shí)現(xiàn)Virginia無(wú)密鑰解密

    python實(shí)現(xiàn)Virginia無(wú)密鑰解密

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)Virginia無(wú)密鑰解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 如何用Anaconda搭建虛擬環(huán)境并創(chuàng)建Django項(xiàng)目

    如何用Anaconda搭建虛擬環(huán)境并創(chuàng)建Django項(xiàng)目

    在本篇文章里小編給大家整理了關(guān)于如何用Anaconda搭建虛擬環(huán)境并創(chuàng)建Django項(xiàng)目的相關(guān)文章,需要的朋友們可以跟著學(xué)習(xí)下。
    2020-08-08
  • Python實(shí)現(xiàn)自定義函數(shù)的5種常見形式分析

    Python實(shí)現(xiàn)自定義函數(shù)的5種常見形式分析

    這篇文章主要介紹了Python實(shí)現(xiàn)自定義函數(shù)的5種常見形式,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python自定義函數(shù)相關(guān)的參數(shù)、默認(rèn)值、隱函數(shù)等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-06-06
  • python按行讀取文件并找出其中指定字符串

    python按行讀取文件并找出其中指定字符串

    這篇文章主要介紹了python按行讀取文件并找出其中指定字符串的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python中24小時(shí)制轉(zhuǎn)換為12小時(shí)制的方法

    python中24小時(shí)制轉(zhuǎn)換為12小時(shí)制的方法

    最近需要實(shí)現(xiàn)一個(gè)需求,求用戶輸入24小時(shí)制的時(shí)間,然后顯示12小時(shí)制的時(shí)間。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 分享一個(gè)可以生成各種進(jìn)制格式IP的小工具實(shí)例代碼

    分享一個(gè)可以生成各種進(jìn)制格式IP的小工具實(shí)例代碼

    這篇文章主要給大家分享了一個(gè)可以生成各種進(jìn)制格式IP的小工具,利用的語(yǔ)言是python實(shí)現(xiàn)的一個(gè)小工具,這個(gè)小工具對(duì)大家的日常使用與開發(fā)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。
    2017-07-07
  • 詳解如何使用Python編寫vim插件

    詳解如何使用Python編寫vim插件

    本篇文章主要介紹了詳解如何使用Python編寫vim插件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Python并發(fā)編程多進(jìn)程,多線程及GIL全局解釋器鎖

    Python并發(fā)編程多進(jìn)程,多線程及GIL全局解釋器鎖

    這篇文章主要介紹了Python并發(fā)編程多進(jìn)程,多線程及GIL全局解釋器鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Python unittest單元測(cè)試openpyxl實(shí)現(xiàn)過(guò)程解析

    Python unittest單元測(cè)試openpyxl實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Python unittest單元測(cè)試openpyxl實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • python opencv常用圖形繪制方法(線段、矩形、圓形、橢圓、文本)

    python opencv常用圖形繪制方法(線段、矩形、圓形、橢圓、文本)

    這篇文章主要介紹了python opencv常用圖形繪制方法(線段、矩形、圓形、橢圓、文本),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論