字符串排列 – 这种回溯递归如何工作?

此函数基本上通过将字符与其所有其他字符交换来打印字符串的所有可能排列。 我理解前两次调用swap和permute。 但是为什么第二次调用掉掉了? 我无法理解这段代码。 有人可以解释一下这是如何工作的吗?

/* Function to print permutations of string This function takes three parameters: 1. String 2. Starting index of the string 3. Ending index of the string. */ void permute(char *a, int l, int r) { int i; if (l == r) printf("%s\n", a); else { for (i = l; i <= r; i++) { swap((a+l), (a+i)); permute(a, l+1, r); swap((a+l), (a+i)); //backtrack } } } 

“回溯”将字符串交换回其原始状态,这对于算法的正确运行至关重要。

你不希望你的函数弄乱你的输入字符串,不是吗?