遞歸函數(shù)屬于那種“難者不會,會者不難”的事情,回想自己大學(xué)時學(xué)習(xí)遞歸函數(shù)的經(jīng)歷,簡直是痛不欲生,代碼里沒有一行是看不懂的,但就是理解不了它是怎樣運行的。 等到自己悟通了原理,就又會覺得這東西太簡單了,不明白自己當(dāng)初為何想不清楚。
對于遞歸函數(shù),你就把握以下幾點:
- 在函數(shù)內(nèi)調(diào)用函數(shù)自身,和調(diào)用其他函數(shù)沒有區(qū)別,反正都是函數(shù)
- 遞歸函數(shù)存在條件,在這個條件下必須return,否則遞歸就成了死循環(huán)
- 最后一條,也是容易出錯的地方,函數(shù)多次遞歸調(diào)用,形成了一個多層次的調(diào)用關(guān)系,函數(shù)return 時,是從最底層開始逐層return的,return只是結(jié)束當(dāng)前所在的函數(shù)
第3條是最難理解的部分,原因在于遞歸函數(shù)的調(diào)用是一個動態(tài)的過程,而我們看到的代碼是靜態(tài)的,對于剛剛接觸編程的人,還不能夠在閱讀完代碼后,僅憑對代碼的邏輯的理解在頭腦中模擬出程序的執(zhí)行過程。
所以,我決定畫一張圖來解釋遞歸函數(shù)的調(diào)用過程,我先寫一個計算階乘的遞歸函數(shù)
def func(n):
if n == 1:
return 1
return n*func(n-1)
print(func(5))
下圖是執(zhí)行func(5) 的遞歸調(diào)用過程
解釋一下這張圖里各個線條的含義:
- 紫色的箭頭表示函數(shù)調(diào)用
- 橙色的箭頭表示函數(shù)執(zhí)行return 語句
- 5次func函數(shù)調(diào)用,前4次我用了淺藍(lán)色,最后一次調(diào)用是橙色
都是函數(shù)調(diào)用,為什么最后一次用橙色呢?最后一次func調(diào)用,和前面4次是不同的,最后一次調(diào)用終止了整個遞歸調(diào)用,從它開始,遞歸調(diào)用進(jìn)入到return階段。
右側(cè)的注釋說明,很好的描述了函數(shù)的執(zhí)行過程,想要計算出5的階乘,先要計算4的階乘,然后5乘以4的階乘就是最終結(jié)果,計算4的階乘需執(zhí)行func(4)。計算4的階乘時,先要計算3的階乘,然后4乘以3的階乘最為func(4) 的結(jié)果等和5相乘作為func(5) 的結(jié)果;計算3的階乘呢?和前面的思路一致。
等到計算1的階乘時,思路就變了,你必須直接return 1的階乘,不能再調(diào)用func函數(shù)了,因為1的階乘就是1,不能轉(zhuǎn)換成1乘以某個數(shù)的階乘。
你不可以將這段程序理解為func函數(shù)被調(diào)用了5次,有5個返回結(jié)果。盡管你的描述沒有錯誤,但從執(zhí)行程序的視角來看,作為用戶,你只調(diào)用了1次func函數(shù),那就是func(5), 剩下的那4次,是函數(shù)func自己內(nèi)部進(jìn)行的處理,你只得到了一個返回結(jié)果,它就是120。
換一個角度來看文章來源:http://www.zghlxwxcb.cn/news/detail-408897.html
- func(1) 的返回結(jié)果是1,給了func(2)
- func(2) 計算2func(1) = 21 =2 , 將2作為結(jié)果返回給func(3)
- func(3) 計算3func(2) = 32 =6,將6返回給func(4)
- func(4) 計算4func(3) = 46=24, 將24返回給func(5)
- func(5) 計算5func(4) = 524=120,你最終得到的就是120
函數(shù)調(diào)用是一個過程,理解遞歸的關(guān)鍵是理解遞歸過程中的調(diào)用鏈?zhǔn)侨绾涡纬傻?,調(diào)用鏈的最后一個環(huán)節(jié)會有一個返回值,之后整個調(diào)用鏈條里的節(jié)點,都根據(jù)自己下一個節(jié)點的返回值計算自己的返回值并返回給上一個節(jié)點。最頂層的節(jié)點是你調(diào)用的,你得到的就是最終的結(jié)果。文章來源地址http://www.zghlxwxcb.cn/news/detail-408897.html
到了這里,關(guān)于一張圖學(xué)會python遞歸函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!