函式之遞迴

金融界的运维小哥發表於2024-06-26

遞迴的特點:
1.可以代替迴圈
2.效率低(因為返回值要一直等待)

def test(x):
print(x)
if int(x / 2) == 0:
return n
res = test(int(x/2))
return res

test(10)

分析以上步驟:
1、test(10)傳入一個引數10,開始呼叫test(10)函式
2、執行第二步print(10) --- 得到一個10
3、執行第三步進行判斷,發現int(10/2) == 5 不等於0 ,條件不成立,return n不會執行,直接進行下一步
4、res = test(int(x/2)) -- 風溼理論,相當於把函式test(5)複製給變數res,繼續呼叫第二層函式。 ****此時res = ?等待函式返回結果
5、接著執行print(5) --- 得到一個5
6、繼續第三步進行if判斷,發現int(5/2) == 2 不等於0,條件不成立,繼續跳過return n不執行。
7、繼續給res = test(int(x/2))賦值,這次變成了res = test(2)
8、接著呼叫第三層函式test(2) ********此時res = ?等待函式返回結果
9、接著執行print(2) -- 得到一個2
10、繼續if判斷,還是不成立,跳過return n
11、這次res = test(1),繼續返回上面迴圈呼叫第四層函式 ******res = ?等待函式返回結果
12、接著print(1) -- 得到一個1
13、繼續if判斷,這次條件成立了,直接返回return n
14、此時的return n是在第四層函式中,所有return n是返回給了第四層函式,最後的n是2,所以第四層函式的res = 1
15、此時就第四層函式已經拿到了res = 1,上面程式中res = ?下面還有一句return res。注意,前面是因為res沒有拿到值,所以不停的呼叫函式,此時已經拿到值了,不需要再呼叫函式,所以可以直接執行下一步return res,即return 1。注意這裡的return 1又是第三層函式的返回值。
16、從15步中可以看到return 1是第三層函式的返回值,意味著第三層中的res = 1,繼續return 1返回給第二層函式
17、第三層函式拿到res = 1,繼續return 1返回給第一層函式,所以res = test(10),自然也就是print(res) = 1,即print(test(1))等於1.
而如果只是呼叫test(10),則結果是:
10
5
2
1

相關文章