1.函數遞歸是函數式編程的重要組成部分,所以對函數遞歸的深層次理解十分重要。本人用圖示的方法解釋函數的層級遞歸方式,先理解下面的函數
def test(n): if n == 1: return 1 else: res = n*test(n-1) return res
從test函數中我們可以看出這個是解決n的階乘計算的函數,首先對於遞歸函數必須具備遞歸結束條件,因為不能造成無限遞歸,否則會消耗掉計算機的內存直至報錯。本函數的結束條件是n=1時函數返回1,因為1的階乘就是1。代表遞歸結束
那么本函數是如何進行遞歸的呢。看下面圖示
1.首先應該明白函數在內存的表現就是一個變量,當代碼中出現def定義函數時,那么這段關於函數的代碼就存在內存中,當函數被調用的時候,就會在內存中讀取代碼然后執行。
2圖中所示test(4)是執行計算4的階乘,開始執行函數時n=4(函數第一層),代碼逐行運行,因為n!=1那么就會執行else代碼塊中的代碼res=n*test(n-1)這時出現了test函數的調用那么就會去執行test函數代碼(第一層中的return res 這句代碼不會執行),此時傳入n的值是3,也就是執行第二層函數,依然同第一層一樣n!=1,那么就會執行第二層中else代碼塊,又會遇到res = n*test(n-1),依然不會執行第二層中的return res。繼續執行進入第三層遞歸,依此類推,直到進入第四層遞歸 此時的n=1那么就會執行if代碼塊內的代碼return 1此時第四層函數結束,因為第四層遞歸是從在第三層代碼里執行的,那么第四層得到的返回就是第三層的res,此時第三層的res的值已經得到,接下來就會執行return res,又因為第三層遞歸是在第二層函數代碼塊里執行的,那么第三層的返回值就是第二層的res......最終返回給第一層的res。最后返回test(4)的結果。
3.函數遞歸是函數式編程的基礎,也是初學者容易卡殼的地方,本人圖示方法解釋函數的層次遞歸的方式,希望能給初學者朋友給點意見。如有錯誤謝謝反饋。