2011年2月18日星期五

递归法求字符串的全排列 (permutation)

每次递归调用,解决一个当前元素数量为n-k ( k = 0...n-1)的全排列,为解决当前当前排列, 又需要递归解决n-k个元素数量为n-k-1的全排列

举例:字符串abc, n = 3, []中的元素为需要计算排列的元素集,[]外的元素为已经确定排列顺序的元素

                                   [abc]         
     /             |             \
               a[bc]          b[ac]          c[ba]
              /        |         /        \         |        \
  ab[c]   ac[b]   ba[c]   bc[a]  cb[a]   ca[b]
     |            |            |            |            |            |
  abc       acb       bac       bca     cba      cab

第一层:k = 0,1个全排列需解决,为此需解决3个元素数为2的全排列
第二层:k = 1,3个全排列需解决,解决每个全排列需要解决2个元素数为1的全排列
第三层:k = 2,6个全排列需解决,解决每个全排列需要解决2个元素数为0的全排列(说明当前层已解得所需的所有全排列)
第四层:k = 3, k等于n,到达递归底层,打印当前排列

static void RecursivePermute(char* str,int k)//递归函数
{
     int i;
     if(k==strlen(str))
          printf("%s\n",str);
     else
     {
          for(i=k;i<strlen(str);i++)
          {
               ExchangeCharacters(str,k,i);
               RecursivePermute(str,k+1);
               ExchangeCharacters(str,k,i);
          }
     }
}

static void ExchangeCharacters(char* str, int p1,int p2)
{
     char tmp;
     tmp=str[p1];
     str[p1]=str[p2];
     str[p2]=tmp;
}

没有评论:

发表评论