优化Ruby中的嵌套循环

时间:2014-11-01 23:16:23

标签: ruby optimization nested-loops

在Ruby中我有三个嵌套循环:

array.each do |a|
  array.each do |b|
    array.each do |c|
      puts a * b * c
    end
  end
end

如果嵌套循环的数量可以增加到5-10次并且迭代次数增加,我该如何优化此代码呢?

示例:

array.each do |a|
  array.each do |b|
    array.each do |c|
       array.each do |d|
         array.each do |e|
           array.each do |f|
             puts a * b * c * d * e * f
           end
         end
      end
    end
  end
end

2 个答案:

答案 0 :(得分:8)

您可以这样做:

array.repeated_combination(array.size).each do |combination| 
  puts combination.reduce(:*)
end

Array#repeated_combination返回一个产生所有可能组合的枚举器。

因为此方法在打印之前生成所有组合,所以输出可能需要一段时间,具体取决于数组的大小。请注意,可能的组合数量增长得非常快:O(nⁿ) n是数组中元素的数量。

答案 1 :(得分:0)

以下是另外两种方式(虽然我更喜欢@ spickermann的回答)

<强>#1

array = [1,2,3]
n = 4
arr = array.product(*[array]*(n-1)).map { |arr| arr.reduce(:*) }
arr.size #=> 81 = arr.size**n
arr.each { |e| puts e }
1
2
3
2
4
6
3
6
9
...
54
27
54
81

如果您只想打印产品,请将map替换为each,将arr.reduce(:*)替换为puts arr.reduce(:*)

<强>#2

sz = array.size
(0...sz**n).map { |i| i.to_s(sz)
                       .rjust(n,'_')
                       .chars
                       .reduce(1) { |t,e| t * (e=='_' ? 1 : array[e.to_i]) }
                }