使用递归查找Ruby中2个数组的所有可能排列



伪代码。

# Suppose 2 arrays:
a1 = [a,b]
a2 = [x,y]
# Looking to find an array of all possible permutations across 2 elements
# Likely not phrasing this correctly, so here's the desired outcome
a,x,b,x
a,x,b,y
a,y,b,x
a,y,b,y
b,x,a,x
b,x,a,y
b,y,a,x
b,y,a,y
# Here's a visualization
a
/   
x       y
|       |
b       b
/      / 
x   y   x   y
yields solutions, reading from top tow
a,x,b,x
a,x,b,y
a,y,b,x
a,y,b,y
repeat with b on top for latter 4 solutions
# Trying to do the code recursively iterating through arrays
def test(a1,a2,outcome = [])
a1.each do |e|
if a2.size == 1
return outcome << e,a2[0]
else
test(a2,a1.reject { |a| a == e }, outcome)
end
end
end

我不知道如何得到想要的结果。

您要查找的是a1的每个元素与a2:的乘积

  • [:a]×a2
  • [:b]×a2

然后是这两个乘积的乘积。

我们可以用Ruby来表达,就像我们用英语表达一样:

x, y = a1.map {|el| [el].product(a2) }
(x.product(y) + y.product(x)).map(&:flatten)

此代码不仅解决了您的问题,甚至还解决了更常见的问题,其中a1a2具有任意数量的元素

def moment_of_truth(a1, a2)
(a1.permutation(2).to_a).product(a2.repeated_permutation(2).to_a).
map { |(e1, e2), (f1, f2)| [e1, f1, e2, f2 ] }
end
moment_of_truth(['a', 'b'], ['x', 'y'])
#=> [["a", "x", "b", "x"], ["a", "x", "b", "y"], ["a", "y", "b", "x"],
#    ["a", "y", "b", "y"], ["b", "x", "a", "x"], ["b", "x", "a", "y"],
#    ["b", "y", "a", "x"], ["b", "y", "a", "y"]]
moment_of_truth(['a', 'b'], ['x', 'y', 'z'])
#=> [["a", "x", "b", "x"], ["a", "x", "b", "y"], ["a", "x", "b", "z"],
#    ["a", "y", "b", "x"], ["a", "y", "b", "y"], ["a", "y", "b", "z"],
#    ["a", "z", "b", "x"], ["a", "z", "b", "y"], ["a", "z", "b", "z"],
#    ["b", "x", "a", "x"], ["b", "x", "a", "y"], ["b", "x", "a", "z"],
#    ["b", "y", "a", "x"], ["b", "y", "a", "y"], ["b", "y", "a", "z"],
#    ["b", "z", "a", "x"], ["b", "z", "a", "y"], ["b", "z", "a", "z"]]
moment_of_truth(['a', 'b', 'c'], ['x', 'y'])
#=> [["a", "x", "b", "x"], ["a", "x", "b", "y"], ["a", "y", "b", "x"],
#    ["a", "y", "b", "y"], ["a", "x", "c", "x"], ["a", "x", "c", "y"],
#    ["a", "y", "c", "x"], ["a", "y", "c", "y"], ["b", "x", "a", "x"],
#    ["b", "x", "a", "y"], ["b", "y", "a", "x"], ["b", "y", "a", "y"],
#    ["b", "x", "c", "x"], ["b", "x", "c", "y"], ["b", "y", "c", "x"],
#    ["b", "y", "c", "y"], ["c", "x", "a", "x"], ["c", "x", "a", "y"],
#    ["c", "y", "a", "x"], ["c", "y", "a", "y"], ["c", "x", "b", "x"],
#    ["c", "x", "b", "y"], ["c", "y", "b", "x"], ["c", "y", "b", "y"]]
moment_of_truth(['a', 'b', 'c'], ['x', 'y', 'z']) 
#=> [["a", "x", "b", "x"], ["a", "x", "b", "y"], ["a", "x", "b", "z"],
#    ["a", "y", "b", "x"], ["a", "y", "b", "y"], ["a", "y", "b", "z"],
#    ["a", "z", "b", "x"], ["a", "z", "b", "y"], ["a", "z", "b", "z"],
#    ["a", "x", "c", "x"], ["a", "x", "c", "y"], ["a", "x", "c", "z"],
#    ["a", "y", "c", "x"], ["a", "y", "c", "y"], ["a", "y", "c", "z"],
#    ["a", "z", "c", "x"], ["a", "z", "c", "y"], ["a", "z", "c", "z"],
#    ["b", "x", "a", "x"], ["b", "x", "a", "y"], ["b", "x", "a", "z"],
#    ["b", "y", "a", "x"], ["b", "y", "a", "y"], ["b", "y", "a", "z"],
#    ["b", "z", "a", "x"], ["b", "z", "a", "y"], ["b", "z", "a", "z"],
#    ["b", "x", "c", "x"], ["b", "x", "c", "y"], ["b", "x", "c", "z"],
#    ["b", "y", "c", "x"], ["b", "y", "c", "y"], ["b", "y", "c", "z"],
#    ["b", "z", "c", "x"], ["b", "z", "c", "y"], ["b", "z", "c", "z"],
#    ["c", "x", "a", "x"], ["c", "x", "a", "y"], ["c", "x", "a", "z"],
#    ["c", "y", "a", "x"], ["c", "y", "a", "y"], ["c", "y", "a", "z"],
#    ["c", "z", "a", "x"], ["c", "z", "a", "y"], ["c", "z", "a", "z"],
#    ["c", "x", "b", "x"], ["c", "x", "b", "y"], ["c", "x", "b", "z"],
#    ["c", "y", "b", "x"], ["c", "y", "b", "y"], ["c", "y", "b", "z"],
#    ["c", "z", "b", "x"], ["c", "z", "b", "y"], ["c", "z", "b", "z"]]
moment_of_truth(['a', 'b', 'c', 'd'], ['x', 'y', 'z', 'a']) # returns 192 arrays
#=> [["a", "x", "b", "x"], ["a", "x", "b", "y"], ["a", "x", "b", "z"],
#    ["a", "x", "b", "a"], ["a", "y", "b", "x"], ["a", "y", "b", "y"],
#    ["a", "y", "b", "z"], ["a", "y", "b", "a"], ["a", "z", "b", "x"],
#    ...
#    ["d", "a", "c", "y"], ["d", "a", "c", "z"], ["d", "a", "c", "a"]]

请参阅阵列#排列、阵列#重复排列和阵列#产品。

请注意,由于如何处理a1a2之间的不对称性,没有提供关于如何处理一个以上阵列(例如,a1a2a3)的添加的指导,因此我没有处理这种情况。

我不知道如何在这里使用递归,但也许读者可以证明我错了。

最新更新