递归打印阵列排列的算法如何正常工作?

时间:2013-10-07 13:50:11

标签: algorithm recursion permutation

我无法理解这个算法是如何工作的。我所看到的所有解释都说如果你有一个诸如{A,B,C}这样的集合并且你想要所有的排列,那么从每个字母开始都要清楚,然后找到其余字母的排列。例如{A} + permutationsOf({B,C})。

但是所有的解释似乎都掩盖了你如何找到其余的排列。一个例子是this one

有人可以尝试向我解释一下这个算法吗?

4 个答案:

答案 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)。

http://jsfiddle.net/mzPpa/

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);