Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化Ruby中的嵌套循环_Ruby_Optimization_Nested Loops - Fatal编程技术网

优化Ruby中的嵌套循环

优化Ruby中的嵌套循环,ruby,optimization,nested-loops,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|

在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

您可以这样做:

array.repeated_combination(array.size).each do |combination| 
  puts combination.reduce(:*)
end
返回产生所有可能组合的枚举数

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

这里还有两种方法(尽管我更喜欢@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(:*)
替换为
put 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]) }
                }
我很抱歉我的英语不好(我是俄罗斯人)。