我想在C++中生成{0, 1, 2, ..., n-1}
的所有基数k
子集。在Haskell,我会做:生成{0,1,2,... n-1}的所有大小k子集
sets 0 n = [[]]
sets k n = [i:s | i <- [0..n-1], s <- sets (k-1) i]
或者在Python:
def sets(k, n):
if k == 0:
return [()]
return ((i,)+s for i in range(n) for s in sets(k-1, i))
因此,例如,(换行增加了清晰度)
ghci> sets 2 8
[[1,0],
[2,0],[2,1],
[3,0],[3,1],[3,2],
[4,0],[4,1],[4,2],[4,3],
[5,0],[5,1],[5,2],[5,3],[5,4],
[6,0],[6,1],[6,2],[6,3],[6,4],[6,5],
[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6]]
会是什么“C++方式“这样做?请注意,我不是问如何来解决问题。我在问C++程序员会将哪些数据类型视为“正常”。
(作为参考,我依稀熟悉C++和有点熟悉C.)
忘记对C有点熟悉,它根本无法帮到你。 – Puppy
我意识到这是一个旧帖子,但我注意到没有人提出迭代算法来做到这一点。查看[my note](http://blazsovdat.com/subsets.pdf)关于生成n集的所有k-子集以描述这样的算法和[它的实现](https://gist.github.com/blazs/9638794)。 (事实证明,它基本上与Knuth在其第4卷中描述的算法之一相同)。 – blazs