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

Python遞歸及尾遞歸優(yōu)化操作實(shí)例分析

 更新時(shí)間:2020年02月01日 11:57:49   作者:dayL_W  
這篇文章主要介紹了Python遞歸及尾遞歸優(yōu)化操作,結(jié)合實(shí)例形式分析了Python遞歸及尾遞歸優(yōu)化相關(guān)概念、原理、應(yīng)用與操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python遞歸及尾遞歸優(yōu)化操作。分享給大家供大家參考,具體如下:

1、遞歸介紹

遞歸簡(jiǎn)而言之就是自己調(diào)用自己。使用遞歸解決問(wèn)題的核心就是分析出遞歸的模型,看這個(gè)問(wèn)題能拆分出和自己類似的問(wèn)題并且有一個(gè)遞歸出口。比如最簡(jiǎn)單的就5的階乘,可以把它拆分成5*4!,然后求4!又可以調(diào)用自己,這種問(wèn)題顯然可以用遞歸解決,遞歸的出口就是求1!,可以直接返回1。用Python實(shí)現(xiàn)如下:

def fact(n):
  if n==1:
    return n
  return n*fact(n - 1);
print(fact(5))

運(yùn)行結(jié)果:

120

2、尾遞歸優(yōu)化

在上面的求遞歸中,也有一定的缺點(diǎn),假如說(shuō)求1000!的階乘,會(huì)出現(xiàn)棧溢出的問(wèn)題,因?yàn)樵诤瘮?shù)執(zhí)行中,沒(méi)調(diào)用一個(gè)函數(shù)都會(huì)把當(dāng)前函數(shù)的調(diào)用位置和內(nèi)部變量保存在棧里面,由于棧的空間不是無(wú)限大(具體棧的最大空間還沒(méi)有查找到),假如說(shuō)調(diào)用層數(shù)過(guò)多,就是出現(xiàn)棧溢出的情況。

這個(gè)時(shí)候就可以用尾遞歸優(yōu)化來(lái)解決,尾調(diào)用的概念非常簡(jiǎn)單,一句話就能說(shuō)清楚,就是指某個(gè)函數(shù)的最后一步是調(diào)用另一個(gè)函數(shù)。

function f(x){
 return g(x);
}

尾遞歸優(yōu)化后的階乘函數(shù)如下:

def fact(n):
  return fact_iter(n,1);
def fact_iter(num, product):
  if num == 1:
    return product
  return fact_iter(num - 1, num * product)
print(fact(5))
print(fact(1000))

尾調(diào)用由于是函數(shù)的最后一步操作,所以不需要保留外層函數(shù)的調(diào)用記錄,因?yàn)檎{(diào)用位置、內(nèi)部變量等信息都不會(huì)再用到了。所以尾遞歸優(yōu)化可以有效的防止棧溢出,但是尾遞歸優(yōu)化需要編譯器或者解釋器的支持,遺憾的是,大多數(shù)編程語(yǔ)言沒(méi)有針對(duì)尾遞歸做優(yōu)化,Python解釋器也沒(méi)有做優(yōu)化,所以,即使把上面的fact(n)函數(shù)改成尾遞歸方式,也會(huì)導(dǎo)致棧溢出。

3、漢諾塔問(wèn)題

漢諾塔問(wèn)題也是一個(gè)經(jīng)典的遞歸問(wèn)題,具體題目就不說(shuō)了,這里分析思路。假設(shè)hanoi(n, a, b, c)實(shí)現(xiàn)把a(bǔ)上的n個(gè)盤子移到c上。

當(dāng)只有一個(gè)盤子時(shí),直接從A移動(dòng)到C即可

如果有3個(gè)盤子,可以這樣:

# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C

如果有很多盤子,我們分析一下該怎么移動(dòng),首先,我們需要把n-1個(gè)盤子移動(dòng)到b中,才可以實(shí)現(xiàn)最簡(jiǎn)單的一步,把a(bǔ)中最大的盤子移動(dòng)到c中,具體怎么轉(zhuǎn)移到b中后面再討論。移動(dòng)最大的盤子后,a和c都可以看成是空的,接下來(lái),把b看成是a,把a(bǔ)看成是b,把a(bǔ)中的n-1個(gè)盤子(這里的n是已經(jīng)減1的n)移動(dòng)到b后,又可以移動(dòng)第二大的盤子。這顯然是一個(gè)遞歸問(wèn)題。

遞歸的出口就是n等于1,直接從a移動(dòng)到c即可。

那么怎么接下來(lái)討論,怎么把n-1個(gè)盤子移動(dòng)到b,這不又是一個(gè)遞歸問(wèn)題嘛!可以調(diào)用它自己呀,只不過(guò)需要把b看成是c,把c看成是b。所以代碼如下:

def hanoi(n,a,b,c):
  #只有一個(gè)盤子,直接移動(dòng)
  if n==1:
    print(a,'->',c)
  else:
    #通過(guò)c把n-1個(gè)盤子移動(dòng)到b
    hanoi(n-1, a,c,b)
    #移動(dòng)最大的盤子
    print(a,'->',c)
    #通過(guò)a把n-1個(gè)盤子移動(dòng)到c
    hanoi(n-1, b,a,c)
hanoi(3,'A','B','C')

運(yùn)行結(jié)果:

A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C

轉(zhuǎn)自https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756044276a15558a759ec43de8e30eb0ed169fb11000

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python列表(list)操作技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • pandas數(shù)據(jù)預(yù)處理之dataframe的groupby操作方法

    pandas數(shù)據(jù)預(yù)處理之dataframe的groupby操作方法

    下面小編就為大家分享一篇pandas數(shù)據(jù)預(yù)處理之dataframe的groupby操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox)

    selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox)

    這篇文章主要介紹了selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Python實(shí)現(xiàn)帶GUI界面的手寫數(shù)字識(shí)別

    Python實(shí)現(xiàn)帶GUI界面的手寫數(shù)字識(shí)別

    這篇文章主要介紹了如何通過(guò)Python實(shí)現(xiàn)帶GUI界面的手寫數(shù)字識(shí)別,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下
    2022-01-01
  • python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析

    python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析

    這篇文章主要介紹了python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析的實(shí)例,幫助大家更好的理解和學(xué)習(xí)使用python。感興趣的朋友可以了解下
    2021-04-04
  • python用模塊zlib壓縮與解壓字符串和文件的方法

    python用模塊zlib壓縮與解壓字符串和文件的方法

    Python標(biāo)準(zhǔn)模塊中,有多個(gè)模塊用于數(shù)據(jù)的壓縮與解壓縮,如zipfile,gzip, bz2等等。這篇文章主要給大家介紹了python如何利用模塊zlib壓縮與解壓字符串和文件的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí)

    Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí)

    這篇文章主要為大家介紹了Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • python填充彩色圖形的實(shí)現(xiàn)示例

    python填充彩色圖形的實(shí)現(xiàn)示例

    本文主要介紹了python填充彩色圖形的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Pycharm 使用 Pipenv 新建的虛擬環(huán)境(圖文詳解)

    Pycharm 使用 Pipenv 新建的虛擬環(huán)境(圖文詳解)

    pipenv 是 Pipfile 主要倡導(dǎo)者、requests 作者 Kenneth Reitz 寫的一個(gè)命令行工具,主要包含了Pipfile、pip、click、requests和virtualenv。這篇文章主要介紹了Pycharm 使用 Pipenv 新建的虛擬環(huán)境的問(wèn)題,需要的朋友可以參考下
    2020-04-04
  • ?分享4款Python 自動(dòng)數(shù)據(jù)分析神器

    ?分享4款Python 自動(dòng)數(shù)據(jù)分析神器

    這篇文章主要給大家分享的是4款Python 自動(dòng)數(shù)據(jù)分析神器,我給大家分享 4 款常用的EDA工具,它們可以自動(dòng)產(chǎn)出統(tǒng)計(jì)數(shù)據(jù)和圖表,為我們節(jié)省大量時(shí)間,需要的朋友可以參考一下
    2022-03-03
  • python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法

    python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法

    今天小編就為大家分享一篇python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02

最新評(píng)論

巨野县| 平和县| 泽普县| 洞头县| 鲁甸县| 吴旗县| 兴安县| 定远县| 高阳县| 谷城县| 汉源县| 措美县| 牙克石市| 铁力市| 子长县| 桐城市| 桂东县| 甘孜| 郧西县| 镇江市| 东源县| 台前县| 海林市| 桃园县| 漳州市| 浮梁县| 东城区| 焉耆| 乌海市| 定兴县| 定结县| 托克托县| 颍上县| 藁城市| 宾阳县| 襄汾县| 锦屏县| 三都| 东乡族自治县| 卓资县| 南靖县|