首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

for循环语句与递归话语结合使用的执行过程

2013-12-04 
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里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

[解决办法]
调试的时候单步执行,查看变量的值的变化。

引用:
字符串的全排列的实现代码:求执行过程?
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);  
        }  
    }  
}  

[解决办法]
引用:
还是不懂,能不能讲得更详细一些,拜托了。

自己举个例子,字符串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

这样一步一步来,没有什么特殊的技巧,熟能生巧而已,最好的办法就是单步调试,跟踪变量的值

热点排行