【发布时间】:2011-09-24 08:00:40
【问题描述】:
我发现递归,除了像阶乘这样非常直接的递归,很难理解。以下 sn-p 打印字符串的所有排列。谁能帮我理解一下。正确理解递归的方法是什么。
void permute(char a[], int i, int n)
{
int j;
if (i == n)
cout << a << endl;
else
{
for (j = i; j <= n; j++)
{
swap(a[i], a[j]);
permute(a, i+1, n);
swap(a[i], a[j]);
}
}
}
int main()
{
char a[] = "ABCD";
permute(a, 0, 3);
getchar();
return 0;
}
【问题讨论】:
-
尝试在纸上画出草图,或者您也可以尝试在调试器中单步执行代码。
-
第一件事是递归有时只会产生优雅、直观的解决方案。有时解决方案很优雅,但一点也不直观,我相信它就在这里。有时它既不优雅,也不直观。会不会有一些不雅但直观的东西?我不知道。在这种情况下,从概念上讲,您首先需要了解的是如何通过交换数组中的各种元素对来创建所有排列。然后你需要了解如何应用递归算法来实现这个概念。它可以帮助在每一步在纸上画出递归树。
-
这是 详尽的递归,正如 Sazzad Hissain Khan 在下面的回答中所说,它是 回溯 的核心,参见 see.stanford.edu/materials/icspacs106b/… 中的第 2 页回溯用于约束传播问题