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

如何使用Python實(shí)現(xiàn)斐波那契數(shù)列

 更新時(shí)間:2019年07月02日 15:02:30   作者:FOOFISH-PYTHON之禪  
這篇文章主要介紹了如何使用Python實(shí)現(xiàn)斐波那契數(shù)列,斐波那契數(shù)列(Fibonacci)最早由印度數(shù)學(xué)家Gopala提出,而第一個(gè)真正研究斐波那契數(shù)列的是意大利數(shù)學(xué)家 Leonardo Fibonacci,需要的朋友可以參考下

斐波那契數(shù)列(Fibonacci)最早由印度數(shù)學(xué)家Gopala提出,而第一個(gè)真正研究斐波那契數(shù)列的是意大利數(shù)學(xué)家 Leonardo Fibonacci,斐波那契數(shù)列的定義很簡(jiǎn)單,用數(shù)學(xué)函數(shù)可表示為:

數(shù)列從0和1開始,之后的數(shù)由前兩個(gè)數(shù)相加而得出,例如斐波那契數(shù)列的前10個(gè)數(shù)是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34。

用 Python 實(shí)現(xiàn)斐波那契數(shù)列常見的寫法有三種,各算法的執(zhí)行效率也有很大差別,在面試中也會(huì)偶爾會(huì)被問到,通常面試的時(shí)候不是讓你簡(jiǎn)單的用遞歸寫寫就完了,還會(huì)問你時(shí)間復(fù)雜度怎樣,空間復(fù)雜度怎樣,有沒有可改進(jìn)的地方。

遞歸法

所謂遞歸就是指函數(shù)的定義中使用了函數(shù)自身的方法

def fib_recur(n):
assert n >= 0
if n in (0, 1):
return n
return fib_recur(n - 1) + fib_recur(n - 2)
for i in range(20):
print(fib_recur(i), end=" ")
>>> 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 

遞歸是一種代碼最簡(jiǎn)潔的方法,但它是效率非常低,因?yàn)闀?huì)出現(xiàn)大量的重復(fù)計(jì)算,時(shí)間復(fù)雜度是:O(1.618 ^ n),1.618是黃金分割。同時(shí)受限于 Python 中遞歸的最大深度是 1000,所以用遞歸來(lái)求解并不是一種可取的辦法。

遞推法

遞推法就是從0和1開始,前兩項(xiàng)相加逐個(gè)求出第3、第4個(gè)數(shù),直到求出第n個(gè)數(shù)的值

def fib_loop(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
for i in range(20):
print(fib_loop(i), end=" ")
>>> 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 

這種算法的時(shí)間復(fù)雜是O(n),呈線性增長(zhǎng),如果數(shù)據(jù)量巨大,速度越到后面會(huì)越慢。

上面兩種方式都是使用分而治之的思想,就是把一個(gè)大的問題化小,然后利用小問題的求解得到目標(biāo)問題的答案。

矩陣法

《線性代數(shù)》是大學(xué)計(jì)算機(jī)專業(yè)低年級(jí)的課程,這門課教的就是矩陣,那時(shí)候覺得這東西學(xué)起來(lái)很枯燥,沒什么用處,工作后你才發(fā)現(xiàn)搞機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、數(shù)據(jù)建模時(shí)大有用處,書到用時(shí)方恨少。其實(shí)矩陣的本質(zhì)就是線性方程式。

斐波那契數(shù)列中兩個(gè)相鄰的項(xiàng)分別為:F(n) 和 F(n - 1),如果把這兩個(gè)數(shù)當(dāng)作一個(gè)2行1列的矩陣可表示為:

因?yàn)?F(n) = F(n-1)+F(n-2),所以就有:

通過反推,其實(shí)它是兩個(gè)矩陣的乘積得來(lái)的

依此類推:

最后可推出:

因此想要求出F(n)的值,只要能求出右邊矩陣的n-1次方的值,最后求得兩矩陣乘積,取新矩陣的第一行的第一列的值即可,比如n=3時(shí),

​可以得知F(3)的值2,F(xiàn)(2)的值為1,因?yàn)閮邕\(yùn)算可以使用二分加速,所以矩陣法的時(shí)間復(fù)雜度為 O(log n)

我們可以用科學(xué)計(jì)算包 numpy 來(lái)實(shí)現(xiàn)矩陣法:

import numpy
def fib_matr(n):
return (numpy.matrix([[1, 1], [1, 0]]) ** (n - 1) * numpy.matrix([[1], [0]]))[0, 0]
for i in range(20):
print(int(fib_matr(i)), end=" ")
>>> 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 

3中不同的算法效率對(duì)比:

從上面圖可以看出遞歸法效率驚人的低,矩陣法在數(shù)據(jù)量比較大的時(shí)候才突顯出它的優(yōu)勢(shì),遞推法隨著數(shù)據(jù)的變大,所花的時(shí)間也越來(lái)越大。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用python實(shí)時(shí)刷新基金估值效果(摸魚小工具)

    利用python實(shí)時(shí)刷新基金估值效果(摸魚小工具)

    這篇文章主要介紹了利用python實(shí)時(shí)刷新基金估值(摸魚小工具),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python安裝Graphviz超詳細(xì)圖文教程

    Python安裝Graphviz超詳細(xì)圖文教程

    這篇文章主要介紹了Python安裝Graphviz超詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 詳解pytorch的多GPU訓(xùn)練的兩種方式

    詳解pytorch的多GPU訓(xùn)練的兩種方式

    本文主要介紹了詳解pytorch的多GPU訓(xùn)練的兩種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • django中使用原生sql語(yǔ)句的方法步驟

    django中使用原生sql語(yǔ)句的方法步驟

    這篇文章主要介紹了django中使用原生sql語(yǔ)句的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python array中關(guān)于[a,b,c]的使用方式

    python array中關(guān)于[a,b,c]的使用方式

    這篇文章主要介紹了python array中關(guān)于[a,b,c]的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Django中redis的使用方法(包括安裝、配置、啟動(dòng))

    Django中redis的使用方法(包括安裝、配置、啟動(dòng))

    下面小編就為大家分享一篇Django中redis的使用方法(包括安裝、配置、啟動(dòng)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-02-02
  • python 提高開發(fā)效率的5個(gè)小技巧

    python 提高開發(fā)效率的5個(gè)小技巧

    這篇文章主要介紹了python 提高開發(fā)效率的5個(gè)小技巧,幫助大家更好的進(jìn)行python開發(fā),感興趣的朋友可以了解下
    2020-10-10
  • 教你如何利用python進(jìn)行數(shù)值分析

    教你如何利用python進(jìn)行數(shù)值分析

    今天教大家如何利用python進(jìn)行數(shù)值分析,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Python數(shù)據(jù)可視化中常見的4種標(biāo)注方式及示例詳解

    Python數(shù)據(jù)可視化中常見的4種標(biāo)注方式及示例詳解

    在Python的數(shù)據(jù)可視化中,標(biāo)注(Annotation)技術(shù)是一種非常有用的工具,它可以幫助用戶更準(zhǔn)確地解釋圖表中的數(shù)據(jù)和模式,在本文中,將帶您了解使用Python實(shí)現(xiàn)數(shù)據(jù)可視化時(shí)應(yīng)該了解的4種標(biāo)注,需要的朋友可以參考下
    2024-12-12
  • Python中輸出ASCII大文字、藝術(shù)字、字符字小技巧

    Python中輸出ASCII大文字、藝術(shù)字、字符字小技巧

    這篇文章主要介紹了Python中輸出ASCII大文字、藝術(shù)字、字符字小技巧,本文首先給出了ASCII大文字、藝術(shù)字、字符字的圖片效果,然后給出了Python中的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

重庆市| 漳平市| 明溪县| 淮北市| 鹿邑县| 浙江省| 南澳县| 浠水县| 新邵县| 兰溪市| 海淀区| 延长县| 太康县| 梓潼县| 陇川县| 安溪县| 曲麻莱县| 龙胜| 额济纳旗| 台湾省| 绥宁县| 内丘县| 五华县| 竹山县| 中宁县| 绥中县| 新乡县| 奇台县| 望城县| 正宁县| 双牌县| 东丰县| 无棣县| 小金县| 阳原县| 苍南县| 奉新县| 华池县| 伊宁县| 鄂托克前旗| 温泉县|