我无法理解这个算法是如何工作的。我所看到的所有解释都说如果你有一个诸如{A,B,C}这样的集合并且你想要所有的排列,那么从每个字母开始都要清楚,然后找到其余字母的排列。例如{A} + permutationsOf({B,C})。
但是所有的解释似乎都掩盖了你如何找到其余的排列。一个例子是this one。
有人可以尝试向我解释一下这个算法吗?
答案 0 :(得分:1)
要了解递归,您需要了解递归..
(c)程序员的智慧
你的问题是关于这个事实,"其余的排列"是那个递归的部分。递归总是由两部分组成:普通案例和递归案例。琐碎的案例指出了没有继续递归的情况,应该返回一些东西。
在你的样本中,琐碎的部分将是{A}
- 这个集合中只有一个排列 - 本身。递归部分将是当前元素的联合和这个"休息部分" - 即如果你有多个元素,那么你的结果将是这个元素和" rest part"之间的排列结合。就排列而言:其余部分是当前设置而没有选定元素。即对于{A,B,C}
的第一个递归步骤设置{A}
和"其余部分":{B,C}
,然后是{B}
和"其余部分&# 34;:{A,C}
- 最后,{C}
与"休息部分":{A,B}
所以你的递归将持续到"其余部分"将是单一元素 - 然后它将结束。
答案 1 :(得分:0)
这是递归实现的重点。假设您已经有解决更简单问题的解决方案,则递归地定义解决方案。稍微考虑一下你会得出结论,你可以对更简单的情况做同样的考虑,使它更简单。继续,直到你达到一个足够简单解决的案例。这个简单的案例称为递归的 bottom 。
另请注意,您必须遍历所有字母,而不仅仅是A
作为第一个元素。因此,你得到所有的排列:
{{A} + permutationsOf({B,C})} +{{B} + permutationsOf({A,C})} + {{C} + permutationsOf({A,B})}
花点时间尝试写下一组四个字母{A, B, C, D}
的所有排列。您会发现您使用的算法接近上面的递归。
答案 2 :(得分:0)
所以,让我们分析一下例子{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
答案 3 :(得分:0)
您的问题的答案是停止标准(在这种情况下为!inputString.length
)。
function permutate(inputString, outputString) {
if (!inputString.length) console.log(outputString);
else for (var i = 0; i < inputString.length; ++i) {
permutate(inputString.substring(0, i) +
inputString.substring(i + 1),
outputString + inputString[i]);
}
}
var inputString = "abcd";
var outputString = "";
permutate(inputString, outputString);