那么,让我们分析一下这个例子{A, B, C}
。
首先,您想从中取出单个元素,然后得到其余部分。因此,您需要编写一些返回对列表的函数:
pairs = [ (A, {B, C})
(B, {A, C})
(C, {A, B}) ]
对于这些对中的每一对,您都会获得一个单独的排列列表,可以从中得出,如下所示:
for pair in pairs do
head <- pair.fst // e.g. for the first pair it will be A
tails <- perms(pair.snd) // e.g. tails will be a list of permutations computed from {B, C}
您需要将 附加head
到每个尾部tails
以获得完整的排列。所以完整的循环将是:
permutations <- []
for pair in pairs do
head <- pair.fst // e.g. for the first pair it will be A
tails <- perms(pair.snd) // e.g. tails will be a list of permutations computed from {B, C}
for tail in tails do
permutations.add(head :: tail); // here we create a complete permutation
head :: tail
意味着我们将一个元素附加head
到列表的开头tail
。
那么现在,如何实现perms
片段中使用的功能tails <- perm(pair.snd)
。我们刚刚做到了!这就是递归的全部内容。:)
我们仍然需要一个基本案例,所以:
perms({X}) = [ {X} ] // return a list of one possible permutation
所有其他情况的函数如下所示:
perms({X...}) =
permutations <- []
pairs <- createPairs({X...})
for pair in pairs do
head <- pair.fst // e.g. for the first pair it will be A
tails <- perms(pair.snd) // e.g. tails will be a list of permutations computed from {B, C}
for tail in tails do
permutations.add( head :: tail ); // here we create a complete permutation
return permutations