为了账号安全,请及时绑定邮箱和手机立即绑定

关于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 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信