鉴于n和k,我需要生成以下所有序列:
n=5, k=2
0,1,2
0,1,3
0,1,4
1,2,3
1,2,4
2,3,4
另一个例子:
n=5, k=3
0,1,2,3
0,1,2,4
0,1,3,4
0,2,3,4
1,2,3,4
我认为可以使用递归解决此问题,但遇到了麻烦。需要帮助
答案 0 :(得分:0)
似乎您已经知道如何生成序列,因此只需描述一下头脑中使用的规则即可。然后从那里向后处理程序。
每个组合c
将成为一个列表; [0,1,2]
,[0,1,3]
等。我们将空组合初始化为c = []
,即空列表。循环时,“选择的”值将添加到我们的组合中。
我们想选择k
个值。一旦k
小于零,我们就不能再向我们的组合c
添加任何值。输出组合。
选择的值将从0
开始,一直计数到n
。我们将用m
表示当前值,并用我们的起始值m = 0
对其进行初始化。一旦m
等于n
通过选择m
开始。做出选择意味着将k
减少1。做出选择还意味着将其添加到我们与c + [m]
的组合中。下一个选择是m + 1
。
接下来,我们不选择m
。不作出选择意味着k
被不还原。我们的组合c
保持不变。移至下一个值m + 1
。
该代码现在大部分会自行编写
def combnk (n, k, m = 0, c = []): # 1
if k < 0:
yield c # 2
elif n == m:
return # 3
else:
yield from combnk (n, k - 1, m + 1, c + [m]) # 4
yield from combnk (n, k , m + 1, c ) # 5
print (list (combnk (5, 2)))
# [ [0, 1, 2]
# , [0, 1, 3]
# , [0, 1, 4]
# , [0, 2, 3]
# , [0, 2, 4]
# , [0, 3, 4]
# , [1, 2, 3]
# , [1, 2, 4]
# , [1, 3, 4]
# , [2, 3, 4]
# ]
print (list (combnk (5, 3)))
# [ [0, 1, 2, 3]
# , [0, 1, 2, 4]
# , [0, 1, 3, 4]
# , [0, 2, 3, 4]
# , [1, 2, 3, 4]
# ]