首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于Python递归函数过程的几个问题

关于Python递归函数过程的几个问题
EN

Stack Overflow用户
提问于 2019-03-27 08:42:48
回答 1查看 27关注 0票数 0

我正在实现一个算法,从n中找出m元素的所有组合。

我已经通过答案验证了整个代码,但是由于没有注释,有些部分很难理解,所以我写了一个问题。

例如,n=7表示输入,4表示to_pick,所以smallest = 0是因为函数中的len(picked) == 0。然后,如果将smallest(0)插入for语句的选中列表中,并通过pick(n, picked, to_pick-1)再次插入to_pick == 0,则将返回and。(0、1、2、3)

但是接下来我无法理解选择的过程是0,1,2,4。当to_pick == 0返回这个函数时(它是返回一个if语句而不是一个函数吗?)我想知道picked.pop()什么时候会被执行。

如果有什么我误解的地方,请寻求指导。

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-27 09:00:38

想象一下:

代码语言:javascript
运行
复制
result = []
pick(7, result, 4)

这段代码所做的是,在第一次调用时,它会将最小的数字设置为0。所以现在你有smallest=0, n=7, to_pick=4了。从这一刻起,你将拥有:

1-您的代码进入循环,空列表将附加最小的值。

2-在此之后,函数将被递归调用,这一次,您的to_picked值减少了1。

3-您当前最小的值将是以前最小的+ 1,再一次您将转到第2行。

4-在您到达最后一个条件后,您的列表将第一次得到printed.The,它将是0,1,2,3。您将从最后一个递归函数返回,然后转到下一行。

5-这一次,最后一个项目将被弹出。所以,你的名单是0,1,2。

6-你在循环中更进一步,这一次你的下一个值是最小的+ 1,最小的值是3,这会被附加,所以你的列表是0,1,2,4。

编辑:所以我发现您在这里的主要问题是您无法理解返回在递归函数中是如何工作的。假设您有这样的非递归函数:

代码语言:javascript
运行
复制
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 + 14更新,这将再次重复,直到您的循环达到其结束为止。您将再次使用[0,1,2]

循环结束后,您的函数将返回到前面的作用域。这一次,[0,1,2]将被弹出,您将得到[0,1],并且这个过程会自己重复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55372934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档