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],并且这个过程会重复。
添加回答
举报