好吧,递归对我来说总是很麻烦。
任何人都可以解释一下递归在这个计算给定字符串排列的函数中是如何工作的。
void permute(char *a, int i, int n)
{
int j;
if (i == n)
printf("%s\n", a);
else
{
for (j = i; j <= n; j++)
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
}
当有两个递归调用后跟一个语句之间的递归时,递归是如何工作的?我希望我很清楚。
感谢。
答案 0 :(得分:1)
尝试用英语阅读代码;
该函数生成字符串a的perumtations,以第i个元素开头,以not元素结束。
如果i和n相等,我们就完成了,只有一个元素,只有一个排列。
否则;
对于i和n之间的每个j,包括两端: - 转换第i个元素和第j个元素的位置。 - 生成不会改变为第一个i元素顺序的所有排列。 - 再次回到第i和第j个元素。
递归调用处于循环中的事实意味着它将被执行多次。 - 字符串的每个可能的第一个字符一次。
以上在具体示例中的含义是该算法将用于字符串“1234”do;
首先生成以“1”开头的字符串,然后是“234”的所有permations,即“1234”的所有排列都以“1”开头。
然后生成以“2”开头的所有排列。
然后所有以“3”开头。
最后以“4”开头的所有permations。
由于“1234”的所有排列将以“1”,“2”,“3”或“4”开头,这将生成字符串“1234”的所有permations。
证明这项工作可以通过归纳来完成,“留作读者的练习”。