如何解决为什么这个组合函数输出一定长度的集合?
不好意思问这个问题,但我正在学习一门名为“使用 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(因此 y
是 nonetype 作为 {{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 举报,一经查实,本站将立刻删除。