我有一个数组,其中的元素是不同大小的数组。例如:
[[3],[11,2],[11,2],[3]]
我想找出嵌套数组中所有单个项的排列。对于上面的数组,我希望返回值为:
[
[3, 11, 11, 3],
[3, 11, 2, 3],
[3, 2, 11, 3],
[3, 2, 2, 3]
]
我有一个可行的解决方案,但似乎特别冗长:
array = [[3],[11,2],[11,2],[3]]
array.product(*array).map { |e| e.drop(1) }.uniq
我应该如何实现一个递归的方法来解决这个问题,这将如何工作?我很难把我的头缠在这上面。
最佳答案
解决这个问题的传统方法是使用Array#product和Array#drop方法。
arr = [[3], [11,2], [11,2,7], [4]]
arr.first.product(*arr.drop(1))
#=> [[3, 11, 11, 4], [3, 11, 2, 4], [3, 11, 7, 4],
# [3, 2, 11, 4], [3, 2, 2, 4], [3, 2, 7, 4]]
如果
arr
的任何元素包含重复项,则返回值也将包含重复项。如果不需要副本,请使用arr.map(&:uniq).first.product(*arr.drop(1))
但是,asker请求了递归解决方案可以这样写:
def prod(arr)
return arr if arr.size == 1
t = prod(arr.drop(1))
arr.first.flat_map { |x| t.map { |a| [x] + a } }
end
prod arr
#=> [[3, 11, 11, 4], [3, 11, 2, 4], [3, 11, 7, 4],
# [3, 2, 11, 4], [3, 2, 2, 4], [3, 2, 7, 4]]
关于arrays - 如何在Ruby中递归查找二维数组的排列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43813834/