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],并且這個過程會重復。
添加回答
舉報