【发布时间】:2017-07-11 12:12:03
【问题描述】:
我正在学习python3。 为了更多地考虑递归,我想实现一个函数 comb(n, k),它返回一个列表,该列表由集合 {1,2,…,n} 中 kk 元素的所有组合组成。
我认为使用循环是不明智的,因为嵌套循环的数量取决于 k。所以我用递归来考虑它。我尝试编写受This question启发的函数 虽然我无法得到正确的答案。
def combinations(sub, data_set, index, still_needed):
if still_needed == 0:
return sub
for i in range(index, len(data_set)):
sub.append(data_set[i])
still_needed = still_needed - 1
return combinations(sub, data_set, index+1, still_needed)
def comb(n, k):
data_set = list(range(1, n+1))
print (combinations([], data_set, 0, k))
如果我测试 Comb(6,3),我只会得到 [1,2,3]。我想得到所有的组合。我的代码有什么问题?还是错过了什么重要的东西?我只是想学习python的递归,这不是功课,谢谢。
预期结果如下:
[[1, 5, 6],
[2, 5, 6],
[3, 5, 6],
[4, 5, 6],
[1, 4, 6],
[2, 4, 6],
[3, 4, 6],
[1, 3, 6],
[2, 3, 6],
[1, 2, 6],
[1, 4, 5],
[2, 4, 5],
[3, 4, 5],
[1, 3, 5],
[2, 3, 5],
[1, 2, 5],
[1, 3, 4],
[2, 3, 4],
[1, 2, 4],
[1, 2, 3]]
虽然顺序并不重要。如果有任何pythonic方法可以解决这个问题,我将不胜感激。嵌套[expression for item in iterable](因为我试过但失败了)。
再次感谢。
【问题讨论】:
-
如果迭代(循环)不明智,因为迭代次数取决于k,那么递归肯定是不明智的,因为它是否崩溃取决于k。
-
您可以为您的示例输入
Comb(6,3)发布所需的结果吗? -
你确实得到了第一个组合。如果您需要更多,则必须选择
yields 或收集所有组合(不是returns 第一个找到的组合)的实现。
标签: python algorithm recursion