以下Python方法对Ruby的正确翻译是什么?
def uniqueCombinations(self, items, n):
"""
items: list of elements
n: number in a group
"""
if n == 0:
yield []
else:
for i in range(len(items)-n+1):
for cc in uniqueCombinations(items[i+1:],n-1):
yield [items[i]]+cc
我想做的是致电
uniqueCombinations(['01', '02', '03'], 2)
并获取
[['01', '02'], ['01', '03'], ['02', '03']]
这是我到目前为止所做的。
def uniq_c(items, n)
if n == 0
yield []
else
puts items.inspect
range_max = items.length-n+1
for i in (0...range_max)
u = uniq_c(items[(i+1)..-1], n-1) { |x| x }
u.each do |cc|
yield [items[i]] + cc
end
end
end
end
但我明白了:
in `+': can't convert Fixnum into Array (TypeError)
答案 0 :(得分:2)
yield [items[i]] + cc
您正在尝试连接数组([items [i]])和Fixnum(cc)。您可以将两者都转换为数组或使用<<将cc推送到[items [i]]的方法。
yield [items[i]] << cc
答案 1 :(得分:2)
从Ruby 1.8.7开始,类Array提供了一种返回组合的方法:
IRB&GT; ['01','02','03']。组合(2).to_a =&GT; [[“01”,“02”],[“01”,“03”],[“02”,“03”]]
答案 2 :(得分:0)
首先,最好将此作为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]]