4.遞歸

首先所有的遞歸都可以使用循環(huán)來替代
遞歸并不是一種高性能解決問題的方式,但使用遞歸可以使代碼更易于理解與閱讀戚篙,更優(yōu)雅

1.什么是遞歸五鲫?
函數(shù)調(diào)用自身就可以稱為遞歸
遞歸需要 :基線條件和遞歸條件,尤其是基線條件岔擂,否則自身調(diào)用將陷入無限循環(huán)

def cutDown(i):
    print(i)
    cutDown(i - 1)


if __name__ == '__main__':
    cutDown(10)

#以下是錯(cuò)誤日志(當(dāng)print打印到 -993時(shí) 報(bào)錯(cuò)位喂,棧溢出)
[Previous line repeated 993 more times]
  File "E:/python/pythonProject1/遞歸.py", line 2, in cutDown
    print(i)
RecursionError: maximum recursion depth exceeded while calling a Python object

上述代碼由于缺少基線條件導(dǎo)致,無限循環(huán)

def cutDown(i):
    if i < 0:   # 當(dāng)i<0時(shí) 退出遞歸
        return
    else:
        print(i)
        cutDown(i - 1)


if __name__ == '__main__':
    cutDown(10)

上述代碼中 i<0 return 即為 基線條件 用來終止遞歸循環(huán)
else 即為 遞歸條件 用來表明 何時(shí)進(jìn)行 遞歸調(diào)用

2.棧
數(shù)據(jù)結(jié)構(gòu)中的一種乱灵,特點(diǎn)是有序且后進(jìn)先出(棧頂優(yōu)先)塑崖,例如 彈夾
在計(jì)算機(jī)中使用的棧是調(diào)用棧
一般來講它主要負(fù)責(zé)程序的執(zhí)行 (處理函數(shù)的執(zhí)行,以及記錄函數(shù)中的局部變量痛倚,參數(shù)规婆,中間計(jì)算過程等狀態(tài)),它以棧的形式來管理函數(shù)執(zhí)行蝉稳,每當(dāng)執(zhí)行函數(shù)時(shí)抒蚜,就會(huì)壓入一個(gè)棧幀(記錄并執(zhí)行函數(shù)),函數(shù)執(zhí)行完畢耘戚,就會(huì)執(zhí)行出棧嗡髓,修改棧幀,把壓入的內(nèi)容銷毀

舉例:

def greet(name):
    print('hello,' + name + "!")
    greet2('maggie')
    print("getting ready to say bye收津。饿这。。")
    bye()


def greet2(name):
    print("how are you")


def bye():
    print("ok bye!")


if __name__ == '__main__':
    greet('maggie')

其實(shí)print也是一個(gè)函數(shù)撞秋,但這里暫時(shí)忽略它

當(dāng)我們調(diào)用 greet('maggie')长捧,計(jì)算機(jī)就會(huì)首先為函數(shù)調(diào)用分配一塊內(nèi)存

image.png

我們使用這些內(nèi)存,變量name 被設(shè)置為ning 這需要存儲(chǔ)在內(nèi)存中


image.png

*每個(gè)函數(shù)調(diào)用時(shí)部服,計(jì)算機(jī)就會(huì)分配內(nèi)存將唆姐,以棧的形式,將函數(shù)壓入棧中廓八,將調(diào)函數(shù)涉及的所有變量的值存儲(chǔ)在內(nèi)存中奉芦。

接下來 打印hello,maggie剧蹂! 在調(diào)用greet2('maggie'),同樣 greet2('maggie') 被分配內(nèi)存壓入棧中声功。


棧頂

棧底

*棧的優(yōu)先級(jí)為后進(jìn)先出,因此棧頂?shù)腉reet2()將會(huì)執(zhí)行宠叼, 棧底的greet()將停止執(zhí)行并等待先巴。

接著執(zhí)行Greet2( ) 打印 how are you , maggie?
Gree2() 執(zhí)行完畢 棧頂?shù)腉reet2()執(zhí)行出棧,釋放內(nèi)存冒冬,并返回 greet()

greet2()出棧

此時(shí)伸蚯,greet()處于棧頂,由等待轉(zhuǎn)換為繼續(xù)執(zhí)行 简烤,打印getting ready to say bye剂邮。。横侦。

接著執(zhí)行bye()方法 挥萌, bye()被壓入棧頂,greet()暫停執(zhí)行

bye()方法處于棧頂

執(zhí)行bye()打印 ok bye! 枉侧,bye ()執(zhí)行完畢引瀑,進(jìn)行出棧,釋放內(nèi)存榨馁,并返回 greet()

bye()出棧憨栽,greet()成為棧頂

greet() 接著執(zhí)行完畢,greet() 進(jìn)行出棧翼虫,釋放內(nèi)存

這個(gè)存儲(chǔ)多個(gè)函數(shù)數(shù)據(jù)屑柔,狀態(tài)的棧被稱為 調(diào)用棧,調(diào)用棧遵循棧頂優(yōu)先原則

3.遞歸調(diào)用棧
遞歸函數(shù)也是用調(diào)用棧蛙讥! 我們來分析下階乘算法 n!(5! =54321)

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

接下來 我們來分析 factorial(3)的執(zhí)行

當(dāng)執(zhí)行 factorial(3) 時(shí)锯蛀, 將fac(3)壓入棧, 3次慢!=1 所以執(zhí)行 else:
執(zhí)行3*fac(3-1)
這里進(jìn)行遞歸 再次調(diào)用 fac() 函數(shù)旁涤,只不過參數(shù)為2 即 fac(2)
fac(2) 壓入棧頂執(zhí)行,fac(3) 暫停迫像, 2劈愚!=1 所以執(zhí)行 else 2*fac(2-1)
進(jìn)行遞歸調(diào)用 fac(2-1)即fac(1)
fac(1) 壓入棧頂執(zhí)行,fac(2) 暫停闻妓,1==1 所以執(zhí)行return 1

fac(1)執(zhí)行完畢 菌羽,出棧,并返回值1
返回fac(2) 繼續(xù)執(zhí)行中斷位置 2*fac(1) 即為 2*1 由缆,執(zhí)行reutn 2
fac(2) 執(zhí)行完畢注祖,出棧猾蒂,并返回值2
返回fac(3),繼續(xù)執(zhí)行3*fac(2)3*2 是晨,執(zhí)行return 6
fac(3)執(zhí)行完畢肚菠,出棧,并返回值 6

*每個(gè)fac()調(diào)用都有自己x變量罩缴,在一個(gè)函數(shù)調(diào)用中不能訪問另一個(gè)x的變量

總結(jié)
遞歸是指函數(shù)調(diào)用自己
每個(gè)遞歸函數(shù)都要有兩個(gè)條件:基線條件蚊逢,遞歸條件
棧有兩種操作:壓入和彈出
所以函數(shù)都進(jìn)入調(diào)用
調(diào)用棧可能很長(zhǎng)箫章,這將占用大量?jī)?nèi)存

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烙荷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檬寂,更是在濱河造成了極大的恐慌终抽,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焰薄,死亡現(xiàn)場(chǎng)離奇詭異拿诸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)塞茅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門亩码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人野瘦,你說我怎么就攤上這事描沟。” “怎么了鞭光?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵吏廉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我惰许,道長(zhǎng)席覆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任汹买,我火速辦了婚禮佩伤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晦毙。我一直安慰自己生巡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布见妒。 她就那樣靜靜地躺著孤荣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盐股,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天钱豁,我揣著相機(jī)與錄音,去河邊找鬼遂庄。 笑死寥院,一個(gè)胖子當(dāng)著我的面吹牛劲赠,可吹牛的內(nèi)容都是我干的涛目。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼凛澎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼霹肝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塑煎,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤沫换,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后最铁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年姐呐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了力细。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雀哨,死狀恐怖磕谅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雾棺,我是刑警寧澤膊夹,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站捌浩,受9級(jí)特大地震影響放刨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尸饺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一进统、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侵佃,春花似錦麻昼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春叉抡,著一層夾襖步出監(jiān)牢的瞬間尔崔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工褥民, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留季春,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓消返,卻偏偏與公主長(zhǎng)得像载弄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撵颊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1.遞歸 假設(shè)你在祖母(老外都喜歡舉祖母的例子)的閣樓中翻箱倒柜宇攻,發(fā)現(xiàn)了一個(gè)上鎖的神秘手提箱。 祖母告訴你倡勇,鑰匙很...
    獨(dú)孤蝴蝶閱讀 647評(píng)論 0 1
  • 遞歸 什么是遞歸 ? 在有基線條件的情況下迭代自身逞刷,即是在有結(jié)束條件的情況下函數(shù)不斷調(diào)用自己。如果沒有結(jié)束條件...
    仲冬初七閱讀 569評(píng)論 0 0
  • 遞歸是很多算法都使用的一種編程方法妻熊。聽說遞歸是一種十分優(yōu)雅的問題解決辦法夸浅,可是對(duì)于初涉遞歸的我,還沒有形成這種獨(dú)特...
    愛吃西瓜的番茄醬閱讀 1,162評(píng)論 0 5
  • 最近在看《算法圖解》這本書扔役,目前也在復(fù)習(xí)這些基礎(chǔ)的算法知識(shí)帆喇,正好也可以在這里做一些總結(jié),以加深自己的體會(huì)與理解厅目。 ...
    hiric閱讀 3,840評(píng)論 0 0
  • 自定義函數(shù)和結(jié)構(gòu)體 格式定義函數(shù)返回類型 函數(shù)名(參數(shù)列表){函數(shù)體}其中函數(shù)體的最后一條語句應(yīng)該是return ...
    巨檸檬閱讀 255評(píng)論 0 0