这是一个老问题,但无论如何,备案,这就是我将它在Ruby中:
class Array
def groups_of_size(n)
Enumerator.new do |yielder|
if self.empty?
yielder.yield([])
else
self.drop(1).combination(n-1).map { |vs| [self.first] + vs }.each do |values|
(self - values).groups_of_size(n).each do |group|
yielder.yield([values] + group)
end
end
end
end
end
end
我使用枚举器是因为输出可以非常快速地增长,所以严格的输出(例如数组)将不会有用。一个用法示例:
>> pp [0, 1, 2, 3, 4, 5].groups_of_size(3).to_a
=>
[[[0, 1, 2], [3, 4, 5]],
[[0, 1, 3], [2, 4, 5]],
[[0, 1, 4], [2, 3, 5]],
[[0, 1, 5], [2, 3, 4]],
[[0, 2, 3], [1, 4, 5]],
[[0, 2, 4], [1, 3, 5]],
[[0, 2, 5], [1, 3, 4]],
[[0, 3, 4], [1, 2, 5]],
[[0, 3, 5], [1, 2, 4]],
[[0, 4, 5], [1, 2, 3]]]
也许看看这里,特别是'multiset'功能。这是Perl,但它应该给你一些代码戳在:http://search.cpan.org/perldoc/Math::Combinatorics – Telemachus
谢谢...知道这是一个“multiset”将使我的谷歌搜索更好。 –