Choose A, get all permutations of {B,C,D} and append A.
Choose B, get all permutations of {A,C,D} and append B.
Choose C, get all permutations of {A,B,D} and append C.
Choose D, get all permutations of {A,B,C} and append D.
Permute(A B C)
Choose A, get all permutations of {B,C} and append A.
Choose B, get all permutations of {A,C} and append B.
Choose C, get all permutations of {A,B} and append C.
结构相同,但问题较小。因此,请更进一步。我们如何排列(A B)
Permute(A B)
Choose A, get all permutations of {B} and append A.
Choose B, get all permutations of {A} and append B.
这是一个递归算法,它本质上是将数组中的每个元素作为第一个元素,然后将不带该元素的调用自身的输出添加到数组中
取3个元素A、B和C并遍历逻辑,让我们调用函数
perm
所以,我们想要
这等于
再次扩展
作为
perm({X}) = X
我们最终得到这正是他们正在做的。这叫做递归,一开始很难理解。假设您有字符串:
A、B、C、D
实际上,您要做的是依次选择每个字符串,然后找到剩余字符串的所有排列,并在所选字符串前面加上前缀
现在,我们有一些看起来非常相似但更小的子问题。这就是递归的核心。拿一个问题,找到一种方法把它变成问题的一个小版本。现在,继续把它变成一个小问题,直到它变得微不足道。现在我们必须弄清楚如何生成3个字符串的排列
结构相同,但问题较小。因此,请更进一步。我们如何排列(A B)
现在我们只需要排列一个字符串。那是微不足道的
现在我们有了一种排列大小为1的字符串列表的方法,我们定义了如何通过排列大小为N-1的列表来排列大小为N的列表。因此,我们可以排列任何大小的列表>;=1,用一个稍微小一点的问题来称呼我们自己。这就是递归的美妙之处。您只需定义如何解决最小的问题,以及如何使用该解决方案来构建更大的解决方案,并且该解决方案以自身为基础
使用的方案是“分而治之”。它的基本思想是将一个大问题分解为一组小问题,并应用相同的机制,直到问题达到“原子”级。换句话说:一个大小为n的问题被连续分解为大小为n-1的n个问题。在底部有一个简单的方法来处理大小1(或任何其他常数)的问题。这通常是使用递归完成的(正如Calgar99所指出的)
这一计划的一个很好的例子是“河内塔”,它也会让你有点头晕目眩。看看吧,这种方法的独创性会让你大吃一惊
对于所给出的代码:n个单词的排列是n-1个单词的排列与n个原始单词中的每一个的串联。这个递归定义为这个问题提供了一个非常优雅的解决方案
相关问题 更多 >
编程相关推荐