Arrays 在Ruby中,如何迭代任意数量的数组?
我正在做一些非常类似背包问题的事情,在背包问题中,我想迭代任意数量输入的所有组合 例如,如果我的函数需要3个数组,我想得到所有的I×j×k组合。如果我的函数需要5个数组,我想得到所有的I×j×k×l×m组合 示例一: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,
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
您可能希望处理转角情况(例如空数组或根本没有输入数组)而不是重复。请阅读问题。到目前为止,你尝试了什么?您能给出一个小样本数组和预期输出吗?对于任意数量的argall_products(*products)
这将把它们作为数组分配给products
。在那之后,你应该知道如何对它们进行笛卡尔积。@MichaelPapile,我知道splat。问题是如何迭代在那一点上我将拥有的N个数组,不知道在我编写函数时会有多少个数组。这是数组/集合的笛卡尔积。一旦有了splat,就可以将数组放入一个数组中,而不管输入了多少数组。关于这一点有很多答案,比如:在Ruby中没有,但逻辑是一样的。您可以迭代地执行,也可以递归地执行。