构建不同级别的嵌套循环

时间:2014-06-06 06:11:11

标签: ruby loops dynamic

我有一个数组来提供一组范围,如range = [[10,15], [7,13], [2,3]..]。我使用这些范围嵌套迭代块,如下所示。

(10..15).each{|i|
  (7..13).each{|j|
    (2..3).each{|k|
        puts "#{k} - #{j} - #{i}"
      }
    }
 }

我必须根据范围数组的大小及其元素动态地形成这些嵌套循环。我想我应该通过构建上面的迭代块来动态定义一个方法,并调用该方法来完成这项工作。但我无法对此进行编码。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

使用Array#product

range = [[10, 15], [7, 13], [2, 3]]
range = range.map { |a,b| (a..b).to_a }
# range is now `[[10, 11, 12, 13, 14, 15], [7, 8, 9, 10, 11, 12, 13], [2, 3]]`
range[0].product(*range[1..-1]) { |xs|
  puts xs.join(' - ')
}

输出:

10 - 7 - 2
10 - 7 - 3
10 - 8 - 2
...
15 - 12 - 3
15 - 13 - 2
15 - 13 - 3

根据OP的评论,

更新。如果您使用的旧版本的ruby没有Array#product,请使用以下命令:

class Array
  def product(*others)
    if others.empty?
      each {|x| yield [x] }
    else
      each {|x| others[0].product(*others[1..-1]) { |ys| yield [x] + ys }}
    end
  end
end

答案 1 :(得分:0)

range = [[10,15], [7,13], [3,2]]
count = 0
str = ''
def dyn_levels(count, range)
    (range[count][0]..range[count][1]).each do |i|
        str.insert(str.size,i)
        if count < range.size
          str.insert(str.size,'-')
          count+=1
          dyn_level(count, range)
        end
    end
end
str.reverse!