2014-11-01 3 views
4

В 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 
+0

Я прошу прощения за мой плохой английский (я русский). –

ответ

8

Вы можете сделать что-то вроде этого:

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

Array#repeated_combination возвращает нумератор, который дает все возможные комбинации.

Поскольку этот способ генерирует все комбинации перед печатью, любой выход может занять некоторое время в зависимости от размера массива. Имейте в виду, что количество возможных комбинаций увеличивается довольно быстро: O(nⁿ) с n является числом элементов в массиве.

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]) } 
       } 
Смежные вопросы