国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一分鐘學(xué)算法-遞歸-斐波那契數(shù)列遞歸解法及優(yōu)化

這篇具有很好參考價值的文章主要介紹了一分鐘學(xué)算法-遞歸-斐波那契數(shù)列遞歸解法及優(yōu)化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一分鐘學(xué)算法-遞歸-斐波那契數(shù)列遞歸解法及優(yōu)化,Python,算法詳解,算法,哈希算法

一分鐘學(xué)一個算法題目。

今天我們要學(xué)習(xí)的是用遞歸算法求解斐波那契數(shù)列。

視頻教程鏈接:https://www.bilibili.com/video/BV1Wu4y1i7JJ/

首先我們要知道什么是斐波那契數(shù)列。

斐波那契數(shù)列,又稱黃金分割數(shù)列,是一個經(jīng)典的數(shù)學(xué)數(shù)列,其特點是第一項,第二項為1,后面每個數(shù)字都是前兩個數(shù)字之和。推導(dǎo)過程如視頻所示,非常非常簡單。

知道了斐波那契數(shù)列的定義后,我們將其代入到遞歸問題的分析當(dāng)中。

首先確定邊界條件,就是第一項和第二項為1,接著確定遞歸關(guān)系,后一項等于前兩項的和。確定了上面這些關(guān)系,我們就可以寫出下面的代碼了。

def fib(x):

    # 邊界條件
    if x==1 or x==2: return 1

    # 遞歸關(guān)系
    return fib(x-2)+fib(x-1)

print(fib(1))
print(fib(2))
print(fib(3))
print(fib(4))
print(fib(5))
print(fib(6))

沒錯,去掉注釋和空行后只有三行代碼,簡潔精煉是遞歸問題的共性,你學(xué)習(xí)過肯定深有體會。下面我們稍微解讀下代碼,這是一個求解斐波那契數(shù)列第n項數(shù)字的函數(shù),函數(shù)名為fib,接受一個參數(shù)n。

如果n等于1或者2,那么就返回1,否則就返回fib(n-2)與fib(n-1)的和,怎么樣,腦子轉(zhuǎn)過來彎了嗎?沒錯,就是這么簡單。我們來嘗試運行使用函數(shù)檢驗一下正確性,發(fā)現(xiàn)都輸出了正確結(jié)果。

但是這個函數(shù)還有很大的優(yōu)化空間,在哪里呢?沒錯,遞歸算法讓我們使用簡潔的代碼解決復(fù)雜的問題。但他的時間復(fù)雜度很高,一不小心沒做好邊界與轉(zhuǎn)換關(guān)系判斷就會導(dǎo)致無限循環(huán)或者棧溢出。

我們以此題為例,假如我們要求解斐波那契數(shù)列的第一百項數(shù)字,那麼我們會得到這張調(diào)用關(guān)系圖,同一項會被重復(fù)計算非常非常多次。所以你運行此函數(shù)可能會導(dǎo)致很長時間都計算不出結(jié)果。

那么,我們該如何優(yōu)化呢?
我們該如何避免重復(fù)計算某一項的值呢?

我們可以在計算出每一項的時候,把計算結(jié)果存到一個字典里。這樣我們在每次計算前先去字典中尋找這一項,如果有值,那么直接拿出來使用,如果沒有,再計算它。

這樣的話我們就可以保證每一項僅被計算一次。運行時間也將會大大縮短。按照以上思路我們對代碼進(jìn)行如下變化。

def fib(n):

    # 邊界條件
    if n==1 or n==2: return 1

    if hash.get(n,0):
        return hash.get(n)

    # 遞歸關(guān)系
    ans=fib(n-2)+fib(n-1)
    hash[ans]=ans
    return ans

hash={}

在代碼中我們增加了以下變化:
每次計算某一項時先去集合中查詢,如果已經(jīng)計算過,那么直接返回值,如果沒有,則計算,并且在返回值之前先在集合中記錄一下。

這樣代碼的算法復(fù)雜度已經(jīng)優(yōu)化了很多了,沒有優(yōu)化版本求解第70項都非常費力,現(xiàn)在優(yōu)化后已經(jīng)可以輕松算出第100項了。但要想算出第一百項還是需要很久時間。

因為其中還存在大量的分支判斷。

而且此解法還遠(yuǎn)遠(yuǎn)不是最優(yōu)解法,關(guān)注up主,我們下集就來講講更快的方法。

更多寶藏

??????????????????????
項目倉庫看這里??:
https://github.com/w-x-x-w
https://gitee.com/w-_-x
公眾號名稱??:編程啟航
博客文章看這里??:
https://blog.csdn.net/weixin_62650212
視頻推送看這里??:
https://space.bilibili.com/1909782963文章來源地址http://www.zghlxwxcb.cn/news/detail-666149.html

到了這里,關(guān)于一分鐘學(xué)算法-遞歸-斐波那契數(shù)列遞歸解法及優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python 中如何實現(xiàn)斐波那契數(shù)列遞歸函數(shù)?

    斐波那契數(shù)列是這樣一個數(shù)列:1, 1, 2, 3, 5, 8, 13, 21, 34, ...... 該數(shù)列從第三項開始,每一項都等于前兩項之和。? 這里我們使用遞歸的方法來實現(xiàn)斐波那契數(shù)列: ? 這個遞歸函數(shù)的基本思路是:? 1. 斐波那契數(shù)列的前兩項是 1。所以如果 n = 1,直接返回 n。 2. 否則,計算前兩項 fib(n-1

    2024年02月01日
    瀏覽(23)
  • 遞歸詳解,斐波那契數(shù)列、二叉樹遍歷、漢諾塔問題的遞歸代碼

    一、遞歸詳解 [1] 遞歸是一種編程技巧,通過函數(shù)調(diào)用自身來解決問題。遞歸中包含三個要素:遞歸定義、遞歸出口和遞歸調(diào)用。 [2] 遞歸定義指的是問題可以被分解為同類且更小規(guī)模的子問題。在遞歸過程中,問題會不斷被分解為規(guī)模更小的子問題,直到達(dá)到一個基本情況,

    2024年02月08日
    瀏覽(22)
  • 基于C語言用遞歸思想實現(xiàn)斐波那契數(shù)列的函數(shù)設(shè)計

    用C語言并利用遞歸思想實現(xiàn)設(shè)計一個程序,完成斐波那契數(shù)列的函數(shù)設(shè)計,利用遞歸實現(xiàn)!

    2024年04月08日
    瀏覽(18)
  • 斐波那契數(shù)列、青蛙跳臺階、漢諾塔(C語言Java通用)、遞歸練習(xí)題

    斐波那契數(shù)列、青蛙跳臺階、漢諾塔(C語言Java通用)、遞歸練習(xí)題

    Write once,Runanywhere. ?????? 本派文章詳細(xì)斐波那契數(shù)列、青蛙跳臺階、漢諾塔(C語言Java通用)、遞歸練習(xí)題。 ?? ?? ?? 如果你覺得我的文章有幫助到你,還請【關(guān)注?點贊?收藏】,得到你們支持就是我最大的動力!!! ?? ?? ?? ? 版權(quán)聲明:本文由【馬上回來了】原創(chuàng)、

    2023年04月08日
    瀏覽(44)
  • 【算法】斐波那契數(shù)列通項公式

    【算法】斐波那契數(shù)列通項公式

    如果數(shù)列 a n a_n a n ? 的遞推公式: a n = c 1 a n ? 1 + c 2 a n ? 2 a_n=c_1a_{n-1}+c_2a_{n-2} a n ? = c 1 ? a n ? 1 ? + c 2 ? a n ? 2 ? ------(1) 根據(jù)待定系數(shù)法,假設(shè) a n ? x a n ? 1 = y ( a n ? 1 ? x a n ? 2 ) a_n-xa_{n-1}=y(a_{n-1}-xa_{n-2}) a n ? ? x a n ? 1 ? = y ( a n ? 1 ? ? x a n ? 2 ?

    2023年04月24日
    瀏覽(17)
  • 【算法學(xué)習(xí)】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    【算法學(xué)習(xí)】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    ? ? ? ? 我在算法學(xué)習(xí)過程中,針對斐波那契數(shù)列模型的動態(tài)規(guī)劃的例題進(jìn)行了一個整理,并且根據(jù)標(biāo)準(zhǔn)且可靠一點的動態(tài)規(guī)劃解題思路進(jìn)行求解類似的動歸問題,來達(dá)到學(xué)習(xí)和今后復(fù)習(xí)的必要。 ? ? ? ? 所謂的斐波那契數(shù)列模型,即當(dāng)前狀態(tài)的值等于前兩種狀態(tài)的值之和。

    2024年02月04日
    瀏覽(27)
  • 【算法】斐波那契數(shù)列與臺風(fēng)的故事

    在小島的一個海濱小鎮(zhèn)上,住著一個名叫蘇菲的女孩。蘇菲一家人靠海為生,她的生活簡單而樸素,與大自然和諧共生。每天,蘇菲都會來到海邊,欣賞那美麗的日出和日落,感受著大海的呼吸。 然而,小島的美麗風(fēng)光并非一成不變。每年夏季,熱帶氣旋活躍,臺風(fēng)頻繁登陸

    2024年02月10日
    瀏覽(24)
  • C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    每一種算法都最好看完第一篇再去找要看的博客,因為這樣會幫你梳理好思路,看接下來的博客也就更輕松了。當(dāng)然,我也會盡量在寫每一篇時都可以讓不懂這個算法的人也能邊看邊理解。 動規(guī)的思路有五個步驟,且最好畫圖來理解細(xì)節(jié),不要怕麻煩。當(dāng)你開始畫圖,仔細(xì)閱

    2024年02月10日
    瀏覽(23)
  • 【算法優(yōu)選】 動態(tài)規(guī)劃之斐波那契數(shù)列模型

    動態(tài)規(guī)劃相關(guān)題目都可以參考以下五個步驟進(jìn)行解答: 狀態(tài)表? 狀態(tài)轉(zhuǎn)移?程 初始化 填表順序 返回值 后面題的解答思路也將按照這五個步驟進(jìn)行講解。 泰波那契序列 Tn 定義如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的條件下 Tn+3 = Tn + Tn+1 + Tn+2 給你整數(shù) n,請返回第 n 個泰波那契

    2024年02月05日
    瀏覽(25)
  • C語言經(jīng)典算法實例6:斐波那契數(shù)列

    C語言經(jīng)典算法實例6:斐波那契數(shù)列

    斐波那契數(shù)列指的是這樣一個數(shù)列:1,1,2,3,5,8,13,21,34,55,89… 這個數(shù)列從第3項開始,每一項都等于前兩項之和。 斐波那契數(shù)列的定義者,是意大利數(shù)學(xué)家萊昂納多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍貫是比薩。 他被人稱作“比薩的萊昂

    2024年02月02日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包