关于Python递归函数课程的问题

我正在实现一种算法来从 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)


慕虎7371278
浏览 170回答 1
1回答

慕少森

想象一下: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 Adef 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],并且这个过程会重复。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python