微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个组合函数输出一定长度的集合?

如何解决为什么这个组合函数输出一定长度的集合?

不好意思问这个问题,但我正在学习一门名为“使用 Python 的数据科学中的概率和统计”的 edx 课程,其中一个功能是创建组合。如下:

def combinations(A,k):
    if k==1:
        return [{x} for x in A]
    sets = []
    for x in A:
        for y in combinations(A-{x},k=k-1):
            if {x}|y not in sets:
                sets.append({x}|y)
    return sets

哪里A=set(range(1,5))

因此调用 combinations(A,2) 将返回以下内容[{1,2},{1,3},4},{2,{3,4}]调用 combinations(A,3) 将返回以下内容 [{1,2,3,4}]

问题:

由于我们没有在任何地方定义 k,函数如何知道在给定集合中返回哪个排列长度?

我希望在 for 循环中调用 combinations 函数后,它看到 k 是 !=1(因此 ynonetype 作为 {{1} } 在 combinations!=1) 时什么都不做,而 k 遍历 A 并被追加,产生一个长度为 x 的长集合。

我们如何获得等于 A 的设置长度?

谢谢!

编辑 1

递归函数......清楚。但是,稍微简化一下函数还是不太明白行为(添加几条打印语句,看看从集合中减去了什么):

k

在第一次迭代时,函数取 1 并且应该将 def permute(A): if len(A)==1: return [tuple(A)] permutations = [] for x in A: print(x) for y in permute(A-{x}): print(x,y) print(f'x = {x},y = {y},length = {len(A-{x})},output = {(x,)+y},tuple = {[tuple(A)]}') permutations.append((x,)+y) return permutations A = {1,3} set(permute(A)) 1 2 2 (3,) x = 2,y = (3,),length = 1,output = (2,3),tuple = [(2,3)] 3 3 (2,) x = 3,y = (2,output = (3,2),3)] 1 (2,3) x = 1,length = 2,output = (1,tuple = [(1,3)] 1 (3,2) x = 1,3)] 2 1 1 (3,) x = 1,3)] 3 3 (1,y = (1,1),3)] 2 (1,3) x = 2,1,3)] 2 (3,1) x = 2,3)] 3 1 1 (2,2)] 2 2 (1,2)] 3 (1,2) x = 3,3)] 3 (2,1) x = 3,3)] 保留为 (2,3),但它所做的是返回 x 的第二次迭代并取 2,因此将 y 保留为只有 3,并打印一个元组作为满足 y 的条件。为什么?

最后,如果 len(A)==1一个 y(因此应该一个一个地返回一个元素),那么在这个例子中 y 如何返回 2 个元素?

解决方法

因为每次进行递归调用时,都是使用 k-1 进行的,然后将其附加到 'x' var

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。