for循环语句与递归语句结合使用的执行过程?字符串的全排列的实现代码:求执行过程?void Permutation(char*
for循环语句与递归语句结合使用的执行过程?
字符串的全排列的实现代码:求执行过程?
void Permutation(char* pStr, char* pBegin)
{
assert(pStr && pBegin);
if(*pBegin == '\0')
printf("%s\n",pStr);
else
{
for(char* pCh = pBegin; *pCh != '\0'; pCh++)
{
swap(*pBegin,*pCh);
Permutation(pStr, pBegin+1);
swap(*pBegin,*pCh);
}
}
}
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
[解决办法]
调试的时候单步执行,查看变量的值的变化。
[解决办法]自己举个例子,字符串abc
在算法的else部分里
首先以a作为第一个字符,递归全排列bc
然后pCh++,指向b,swap(a,b)就是以b作为第一个字符,再全排列ac
最后pCh指向字符c,swap(a,c)就是以c作为第一个字符,全排列ba
[解决办法]好吧 今天比较闲 这个说起来比较复杂,不如画图清晰
abc为例
首先pCh和pBegin都指向a
进入第一次for循环
swap(a,a)相当于没交换
然后递归调用函数(设为函数2),参数分别是abc(pStr),bc(pBegin+1)
函数2中 pCh和pBegin都指向b
进入这个递归函数2的第一次for循环
在这里先swap,
在递归,设为函数3,参数分别是abc(pStr),c(pBegin+1)
pCh和pBegin都指向c
进入函数3的第一次for循环
swap(c,c),
再递归,设为函数4,参数分别是abc(pStr),\0(pBegin+1)
注意,在递归函数4中,*pBegin=='\0',所以打印出abc,并且返回到调用它的函数,即函数3的for循环中
函数3执行Permutation函数后的swap,并且结束for循环,返回到调用它的函数,即函数2的for循环中
我们上面讨论过,函数2的参数是abc和bc,并且以上步骤在函数2中pCh指向的b
那么,下一次循环pCh指向c,进入for
swap(b,c),那么字符串就变成了acb
然后再递归调用Permutation(acb,cb)
按照之前的步骤,会输出acb
这样一步一步来,没有什么特殊的技巧,熟能生巧而已,最好的办法就是单步调试,跟踪变量的值