Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Arrays 在Ruby中,如何迭代任意数量的数组?_Arrays_Ruby_Iterator - Fatal编程技术网

Arrays 在Ruby中,如何迭代任意数量的数组?

Arrays 在Ruby中,如何迭代任意数量的数组?,arrays,ruby,iterator,Arrays,Ruby,Iterator,我正在做一些非常类似背包问题的事情,在背包问题中,我想迭代任意数量输入的所有组合 例如,如果我的函数需要3个数组,我想得到所有的I×j×k组合。如果我的函数需要5个数组,我想得到所有的I×j×k×l×m组合 示例一: result = all_products([1,2,3,4,5], [1,2,3], [10,20,30,40,50,60,70,80]) result.length == 120 例二: result = all_products([1,2,3], [1,2,3], [1,

我正在做一些非常类似背包问题的事情,在背包问题中,我想迭代任意数量输入的所有组合

例如,如果我的函数需要3个数组,我想得到所有的I×j×k组合。如果我的函数需要5个数组,我想得到所有的I×j×k×l×m组合

示例一:

result = all_products([1,2,3,4,5], [1,2,3], [10,20,30,40,50,60,70,80])

result.length == 120
例二:

result = all_products([1,2,3], [1,2,3], [1,2,3], [1,2,3], [1,2,3], [1,2,3])

result.length == 729
但我不知道我将接受多少阵列

用Ruby怎么做

这不是问如何找到1个数组的所有对。我的输入数组可能都不同

以下是我迄今为止所做的尝试:

def self.all_combinations(*sets)
 input = *sets; 
 prod = sets.inject(1) { |p,a| p * a.length } 
 prod.times do |p| 
  args = [] 
  index = p 
  input.each do |array| 
    quotient = index / array.length
    remainder = index % array.length
    args << array[remainder] 
    index = quotient
    pp args 
  end 
end 
def self.all_组合(*套)
输入=*组;
prod=sets.injection(1){p,a{p*a.length}
生产时间做| p |
args=[]
指数=p
input.each do|array|
商=索引/数组长度
余数=索引%array.length

args我将从获取两个数组的“乘积”开始:

def product2(array1, array2)
  array1.map { |e1| array2.map { |e2| e1*e2 } }.flatten
end
然后可以将其推广到任意数量的数组:

def all_products(*arrays)
  arrays.reduce([1]) { |result, array| product2(result, array) }
end

您可能希望处理转角情况(例如空数组或根本没有输入数组)

而不是重复。请阅读问题。到目前为止,你尝试了什么?您能给出一个小样本数组和预期输出吗?对于任意数量的arg
all_products(*products)
这将把它们作为数组分配给
products
。在那之后,你应该知道如何对它们进行笛卡尔积。@MichaelPapile,我知道splat。问题是如何迭代在那一点上我将拥有的N个数组,不知道在我编写函数时会有多少个数组。这是数组/集合的笛卡尔积。一旦有了splat,就可以将数组放入一个数组中,而不管输入了多少数组。关于这一点有很多答案,比如:在Ruby中没有,但逻辑是一样的。您可以迭代地执行,也可以递归地执行。