为了获得所有排列,我们执行以下操作:
我们从左到右取出数组中的一个元素。
xs.map(x => // 1
对于所有其他元素,我们递归地生成排列:
permutations(without(xs, x)) // [[2, 3], [3, 2]]
对于每个排列,我们添加我们在开始时取出的值:
.map(perm => [xs, ...perm]) // [[1, 2, 3], [1, 3, 2]]
现在对所有数组元素重复此操作,结果是:
[
// 1
[[1, 2, 3], [1, 3, 2]],
// 2
[[2, 1, 3], [2, 3, 1]],
// 3
[[3, 1, 2], [3, 2, 1]]
]
现在我们只需要flatten(...)
该数组以获得所需的结果。
整个事情可以表示为递归调用树:
[1, 2, 3]
- [2, 3] ->
- [3] -> [1, 2, 3]
- [2] -> [1, 3, 2]
- [1, 3] ->
- [1] -> [2, 3, 1]
- [3] -> [2, 1, 3]
- [1, 2] ->
- [1] -> [3, 2, 1]
- [2] -> [3, 1, 2]