欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

用 Python 實現(xiàn)斐波那契數(shù)列常見的寫法有三種,各算法的執(zhí)行效率也有很大差別,在面試中也會偶爾會被問到,通常面試的時候不是讓你簡單的用遞歸寫寫就完了,還會問你時間復(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 

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

遞推法

遞推法就是從0和1開始,前兩項相加逐個求出第3、第4個數(shù),直到求出第n個數(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 

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

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

矩陣法

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

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

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

通過反推,其實它是兩個矩陣的乘積得來的

依此類推:

最后可推出:

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

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

我們可以用科學(xué)計算包 numpy 來實現(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中不同的算法效率對比:

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

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

相關(guān)文章

  • Windows下PyCharm2018.3.2 安裝教程(圖文詳解)

    Windows下PyCharm2018.3.2 安裝教程(圖文詳解)

    這篇文章主要介紹了Windows下PyCharm2018.3.2 安裝教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • python四則運算表達(dá)式求值示例詳解

    python四則運算表達(dá)式求值示例詳解

    這篇文章主要為大家介紹了python四則運算表達(dá)式求值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Python lambda和Python def區(qū)別分析

    Python lambda和Python def區(qū)別分析

    Python支持一種有趣的語法,它允許你快速定義單行的最小函數(shù)。這些叫做lambda的函數(shù),是從Lisp借用來的,可以用在任何需要函數(shù)的地方
    2014-11-11
  • Python 異常處理Ⅳ過程圖解

    Python 異常處理Ⅳ過程圖解

    這篇文章主要介紹了Python 異常處理Ⅳ過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Pycharm plot獨立窗口顯示的操作

    Pycharm plot獨立窗口顯示的操作

    這篇文章主要介紹了Pycharm plot獨立窗口顯示的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • python中單下劃線與雙下劃線的區(qū)別及說明

    python中單下劃線與雙下劃線的區(qū)別及說明

    這篇文章主要介紹了python中單下劃線與雙下劃線的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 教你使用pyinstaller打包Python教程

    教你使用pyinstaller打包Python教程

    今天帶大家學(xué)習(xí)使用pyinstaller打包Python,文中有非常詳細(xì)的圖文示例及代碼,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python量化交易實戰(zhàn)之使用Resample函數(shù)轉(zhuǎn)換“日K”數(shù)據(jù)

    Python量化交易實戰(zhàn)之使用Resample函數(shù)轉(zhuǎn)換“日K”數(shù)據(jù)

    resample函數(shù)是Python數(shù)據(jù)分析庫Pandas的方法函數(shù),它主要用于轉(zhuǎn)換時間序列的頻次,今天通過本文給大家分享python使用Resample函數(shù)轉(zhuǎn)換時間序列的相關(guān)知識,感興趣的朋友一起看看吧
    2021-06-06
  • Python3實現(xiàn)zip分卷壓縮過程解析

    Python3實現(xiàn)zip分卷壓縮過程解析

    這篇文章主要介紹了Python3實現(xiàn)zip分卷壓縮過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • python之用Numpy和matplotlib畫一個魔方

    python之用Numpy和matplotlib畫一個魔方

    這篇文章主要介紹了如何用Numpy和matplotlib畫一個魔方,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08

最新評論