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

Python進(jìn)階之尾遞歸的用法實(shí)例

 更新時(shí)間:2018年01月31日 11:27:52   作者:Handsome_Owen  
本篇文章主要介紹了Python進(jìn)階之尾遞歸的用法實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

作者是一名沉迷于Python無法自拔的蛇友,為提高水平,把Python的重點(diǎn)和有趣的實(shí)例發(fā)在簡(jiǎn)書上。

尾遞歸

如果一個(gè)函數(shù)中所有遞歸形式的調(diào)用都出現(xiàn)在函數(shù)的末尾,我們稱這個(gè)遞歸函數(shù)是尾遞歸的。當(dāng)遞歸調(diào)用是整個(gè)函數(shù)體中最后執(zhí)行的語(yǔ)句且它的返回值不屬于表達(dá)式的一部分時(shí),這個(gè)遞歸調(diào)用就是尾遞歸。尾遞歸函數(shù)的特點(diǎn)是在回歸過程中不用做任何操作,這個(gè)特性很重要,因?yàn)榇蠖鄶?shù)現(xiàn)代的編譯器會(huì)利用這種特點(diǎn)自動(dòng)生成優(yōu)化的代碼。

(來源于不說人話的某度)

下面是筆者的個(gè)人理解:把計(jì)算出的值存在函數(shù)內(nèi)部(當(dāng)然不止尾遞歸)是其計(jì)算方法,從而不用在棧中去創(chuàng)建一個(gè)新的,這樣就大大節(jié)省了空間。函數(shù)調(diào)用中最后返回的結(jié)果是單純的遞歸函數(shù)調(diào)用(或返回結(jié)果)就是尾遞歸。

實(shí)例

實(shí)例還是和筆者的上一篇文章相同,建議讀者閱讀 Python —— 遞歸

1、階乘

常規(guī)遞歸階乘:

def factorial(n): 
  if n == 0:
    return 1
  return factorial(n - 1) * n

我們來看一下執(zhí)行過程:

factorial(4) 
factorial(3) * 4 
factorial(2) * 3 * 4 
factorial(1) * 2 * 3 * 4 
factorial(0) * 1 * 2 * 3 * 4 
1 * 1 * 2 * 3 * 4 
1 * 2 * 3 * 4 
2 * 3 * 4 
6 * 4 
24

但是如果把上面的函數(shù)寫成如下形式:

def factorial(n, acc=1): 
  if n == 0:
    return acc
  return factorial(n - 1, n * acc)

我們?cè)倏聪聢?zhí)行過程:

factorial(4, 1) 
factorial(3, 4) 
factorial(2, 12) 
factorial(1, 24) 
factorial(0, 24) 
24

很直觀的就可以看出,這次的 factorial 函數(shù)在遞歸調(diào)用的時(shí)候不會(huì)產(chǎn)生一系列逐漸增多的中間變量了,而是將狀態(tài)保存在 acc 這個(gè)變量中。而這種形式的遞歸,就叫做尾遞歸。

2、斐波那契數(shù)列

常規(guī)遞斐波那契數(shù)列:

def fib(n):
  if n < 2:
    return n
  else:
    return fib(n - 1) + fib(n - 2)

而尾遞歸:

def fib_tail(n, r, t):
  if n == 1:
    return r
  else:
    return fib_tail(n - 1, t, r + t)

一下子就充滿了逼格,還高效了許多,何樂而不為呢!

總結(jié)

可以看出,在每次遞歸調(diào)用的時(shí)候,都會(huì)產(chǎn)生一個(gè)臨時(shí)變量,導(dǎo)致進(jìn)程內(nèi)存占用量增大一些。這樣執(zhí)行一些遞歸層數(shù)比較深的代碼時(shí),除了無謂的內(nèi)存浪費(fèi),還有可能導(dǎo)致著名的堆棧溢出錯(cuò)誤。

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

相關(guān)文章

  • Python中g(shù)event模塊協(xié)程使用

    Python中g(shù)event模塊協(xié)程使用

    協(xié)程是一種用戶態(tài)的輕量級(jí)線程,本文主要介紹了Python中g(shù)event模塊協(xié)程使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • python通配符之glob模塊的使用詳解

    python通配符之glob模塊的使用詳解

    這篇文章主要介紹了python通配符之glob模塊的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python中常用的數(shù)據(jù)結(jié)構(gòu)介紹

    python中常用的數(shù)據(jù)結(jié)構(gòu)介紹

    這篇文章主要介紹了python中常用的數(shù)據(jù)結(jié)構(gòu)介紹,幫助大家更好的理解和學(xué)習(xí)python的基礎(chǔ)知識(shí),感興趣的朋友可以了解下
    2021-01-01
  • 詳解如何利用Python拍攝延時(shí)攝影

    詳解如何利用Python拍攝延時(shí)攝影

    隨著游戲引擎技術(shù)的快速發(fā)展,游戲畫面越來越精美,很多玩家希望拍攝這些精美游戲中的畫面。本文將講解如何利用Python實(shí)現(xiàn)延時(shí)攝影的拍攝,需要的可以參考一下
    2022-03-03
  • 黑科技 Python腳本幫你找出微信上刪除你好友的人

    黑科技 Python腳本幫你找出微信上刪除你好友的人

    黑科技,Python腳本幫你找出微信上刪除你好友的人,有興趣的朋友可以閱讀一下
    2016-01-01
  • python 讀寫txt文件 json文件的實(shí)現(xiàn)方法

    python 讀寫txt文件 json文件的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猵ython 讀寫、創(chuàng)建 文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • Python用二分法求平方根的案例

    Python用二分法求平方根的案例

    這篇文章主要介紹了Python用二分法求平方根的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python設(shè)計(jì)模式之抽象工廠模式

    Python設(shè)計(jì)模式之抽象工廠模式

    這篇文章主要為大家詳細(xì)介紹了Python設(shè)計(jì)模式之抽象工廠模式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 將python項(xiàng)目打包成exe與安裝包的全過程

    將python項(xiàng)目打包成exe與安裝包的全過程

    Python唯二的難題運(yùn)行速度和源代碼反編譯,一直是被眾多語(yǔ)言所詬病,下面這篇文章主要給大家介紹了關(guān)于如何將python項(xiàng)目打包成exe與安裝包的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解

    對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解

    今天小編就為大家分享一篇對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評(píng)論

夹江县| 宁城县| 汝城县| 京山县| 黑水县| 神木县| 绥化市| 二手房| 忻城县| 上犹县| 苍山县| 平顺县| 南岸区| 固原市| 临夏县| 焦作市| 米脂县| 额尔古纳市| 青神县| 金昌市| 玉山县| 北川| 普安县| 青冈县| 金湖县| 酒泉市| 万荣县| 文安县| 武川县| 封开县| 峨山| 拉孜县| 西乌| 大埔区| 乌苏市| 扬中市| 西充县| 安溪县| 土默特右旗| 邛崃市| 华安县|