亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于Python遞歸函數課程的問題

關于Python遞歸函數課程的問題

慕虎7371278 2021-12-17 16:27:45
我正在實現一種算法來從 n 中找出 m 個元素的所有組合。我已經通過答案驗證了整個代碼,但是因為沒有注釋,所以有一些難以理解的部分,所以我寫了一個問題。例如,輸入為 n = 7,to_pick 為 4,smallest = 0因為len(picked) == 0在函數內部。然后,如果smallest(0)在 for 語句中插入選擇列表并再次to_pick == 0通過,則返回picked pick(n, picked, to_pick-1)。([0, 1, 2, 3])但是接下來我無法理解選擇 [0,1,2,4] 的過程。當to_pick == 0,函數返回(它返回一個 if 語句而不是一個函數?)我想知道什么時候picked.pop()會被執行。如果我有什么誤解,請尋求指導。代碼def pick(n, picked, to_pick):    if to_pick is 0:        return print(picked)    if len(picked) is 0:        smallest = 0    else:        smallest = picked[-1] + 1    for next in range(smallest, n):        picked.append(next)        pick(n, picked, to_pick - 1)        picked.pop()if __name__ == '__main__':    result = list()    pick(7, result, 4)
查看完整描述

1 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

想象一下:

result = []
pick(7, result, 4)

這段代碼的作用是,在第一次調用時,它會將您的最小數字設置為 0。所以此時您有smallest=0, n=7, to_pick=4. 從這一刻起,您將擁有:

1-您的代碼進入循環,您的空列表將附加最小值。

2- 之后該函數將被遞歸調用,這次你的 to_picked 值減一。

3- 您當前的最小值將是之前的最小值 + 1,您將再次轉到第 2 行。

4- 達到最終條件后,您的列表將被打印。第一次將是 [0,1,2,3]。您將從最后一個遞歸函數返回,并轉到下一行。

5- 這次將彈出最后一個項目。因此,您的列表將是 [0,1,2]。

6- 你在循環中更進一步,這次你的下一個值將是最小的 + 1,你的最小值是 3。這將被附加,所以你的列表將是 [0,1,2,4]。

編輯:所以我發現你在這里的主要問題是你無法理解 return 在遞歸函數中是如何工作的。想象一下,你有這樣的非遞歸函數:

def foo(A):

   return A

def bar(B):

   result = foo(B)

   return result

在這里,在函數bar功能后foo完成其工作,它會回到以前的范圍,這是它的功能范圍bar,并在下一行將得到執行,這是return result。


遞歸函數的邏輯是一樣的,不同的是你一遍又一遍地調用同一個函數。達到最終條件后,您將返回到之前的范圍,直到再次達到最終條件。并且此操作將重復到您達到所有可能的最終條件的程度。


因此,在您的情況下,第一次達到最終條件時,您將擁有:


n=7, picked = [0,1,2], smallest = 2, n = 1


從最終條件返回后,您選擇的數組將是[0,1,2,3],代碼將執行下一行。這將是picked.pop(). 所以你會picked = [0,1,2]再次結束,但這次你已經到達了循環的最后一行。


因此,下次您的next值將由smallest + 1or更新時4,這將再次重復,直到您的循環結束。你會[0,1,2]再次結束。


循環結束后,您的函數將返回到先前的作用域。這一次[0,1,2]會被彈出,你最終會得到[0,1],并且這個過程會重復。


查看完整回答
反對 回復 2021-12-17
  • 1 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號