伪代码。
# 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)
此代码不仅解决了您的问题,甚至还解决了更常见的问题,其中a1
和a2
具有任意数量的元素。
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"]]
请参阅阵列#排列、阵列#重复排列和阵列#产品。
请注意,由于如何处理a1
和a2
之间的不对称性,没有提供关于如何处理一个以上阵列(例如,a1
、a2
和a3
)的添加的指导,因此我没有处理这种情况。
我不知道如何在这里使用递归,但也许读者可以证明我错了。