首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Ruby中的嵌套循环

优化Ruby中的嵌套循环
EN

Stack Overflow用户
提问于 2014-11-01 23:16:23
回答 2查看 1.3K关注 0票数 4

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

代码语言:javascript
复制
array.each do |a|
  array.each do |b|
    array.each do |c|
      puts a * b * c
    end
  end
end

如果嵌套循环的数量可以增加到5-10个或更多的迭代,我如何优化这段代码?

示例:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-01 23:31:34

你可以这样做:

代码语言:javascript
复制
array.repeated_combination(array.size).each do |combination| 
  puts combination.reduce(:*)
end

Array#repeated_combination返回一个枚举数,该枚举数生成所有可能的组合。

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

票数 8
EN

Stack Overflow用户

发布于 2014-11-02 04:26:31

以下是另外两种方法(尽管我更喜欢@spickermann的答案)

#1

代码语言:javascript
复制
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替换为eacharr.reduce(:*)替换为puts arr.reduce(:*)

#2

代码语言:javascript
复制
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]) }
                }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26694269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档