枚举数的笛卡尔积已经包含在最新的ruby core中,从3.2版本开始,类为Enumerator::Product。
我的问题是,在以前的ruby版本中,它是最好的(性能,内存,开销,...)实现。
更确切地说,我的问题本质上是比较左递归和右递归版本。
def left_cartesian_product((*f, e))
Enumerator.new do |y|
if e.nil?
y << []
else
left_cartesian_product(f).each { |u|
e.each { |x|
y << [*u, x]
}
}
end
end
end
def right_cartesian_product((e, *f))
Enumerator.new do |y|
if e.nil?
y << []
else
e.each { |x|
right_cartesian_product(f).each { |u|
y << [x, *u]
}
}
end
end
end
# usage sample
xxxx_cartesian_product(['a'..'h', 1..8]).each { |c, r| puts "%s%d" % [c,r] }
如果有更聪明的方法来实现它,我也很感兴趣,开销更少,代码更少,…我在parameters list中为这两种情况都保留了一个数组,因为left case在(*f,e= nil)中不会表现得很好,并且至少要声明一个参数。
1条答案
按热度按时间ej83mcc01#
右边的一个很慢,因为它初始化了很多
Enumerator
对象:个字符
理想情况下,您应该只初始化一个:
型
或者使用
Enumerable
:型
这里有一个小基准:
的字符串