Во-первых, было бы лучше сделать это как метод класса Array
.
Во-вторых, вы можете исправить ошибку, изменив [items[i]] + cc
на [items[i]] + [cc]
.
В-третьих, вот другая реализация, которую я использовал, посмотрите, что вы думаете. Он создает массив перестановок, представленных индексами, а затем отображает каждый индекс на его значение.
class Array
def combinations(n)
perms = []
a = (0...n).to_a
while perms.push a.dup
break if a.increment!(a.length - 1, self.length-1).nil?
end
perms.map {|p| p.map {|i| self[i]} }
end
def increment!(i, max)
self[i] += 1
while self[i] > max
return nil if i <= 0
return nil if self.increment!(i - 1, max).nil?
self[i] = self[i - 1] + 1
end
self.dup
end
end
[1,2,3].combinations 3 # => [[1, 2, 3]]
[1,2,3].combinations 2 # => [[1, 2], [1, 3], [2, 3]]
[1,2,3].combinations 1 # => [[1], [2], [3]]
[:foo,:bar,:baz,:quux,:wibble].combinations 3
# => [[:foo, :bar, :baz],
# [:foo, :bar, :quux],
# [:foo, :bar, :wibble],
# [:foo, :baz, :quux],
# [:foo, :baz, :wibble],
# [:foo, :quux, :wibble],
# [:bar, :baz, :quux],
# [:bar, :baz, :wibble],
# [:bar, :quux, :wibble],
# [:baz, :quux, :wibble]]