此问题已经在这里有了答案:
我必须编写一个函数,将两个数字n和k作为输入,并在屏幕上打印由n创建的集合的所有k长度子集(顺序不重要),因此基本上是一个函数,可以打印所有k -n的组合。
例如:如果n = 4且k = 2,则初始集合变为(1,2,3,4),并打印以下子集:
(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)
我知道已经有一个函数可以执行此操作,但是我必须从头开始创建该函数,因此禁止使用itertools或任何其他模块,并且不能,我不能从文档并将其粘贴到我的代码中。如您所知,这是我大学的作业,所以我不是要您为我解决它,而是给我一个代码,我希望有人向我解释我该怎么做。
我知道必须使用递归函数来完成,因为数量k未知。我还考虑了两种不同的解决方案,我不确定它们是否正确:
第一个解决方案:
创建给定集合的幂集,然后删除长度不同于k的所有子集。
第二解决方案:
使用从1到n ^ k的数字填充列表,然后删除所有重复的数字。然后将数字转换为字符串并将其打印为子集。
尝试此代码:
def combinations(l, k):
if k <= 0:
comb = [None]
else:
comb = []
for i, item in enumerate(l, 1):
rem_items = l[i:]
rem_comb = combinations(rem_items, k-1)
comb.extend(item if c is None else (item, c) for c in rem_comb)
return comb
n = 4
k = 2
combinations(range(1,n), k)
# [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]