递归题一

来源:互联网 发布:软件图 编辑:程序博客网 时间:2024/06/07 05:37
 打印出已知字符串的所有排列组合,比如给出"abc",打印abc,acb,bac,bca,cab,cba.
所有可能个数是n!,n为字符串长度。

数学表达:

E={e1,e2,e3,...en}.表示字符串的集合,令Ei为移去ei后的集合,perm(X)表示集合X的所有元素排列。ei.perm(X)表示在perm(X)的基础上加前缀ei.

例如:E={a,b,c}, E1={b,c},perm(E1)={bc,cb}, e1.perm(E1)={abc,acb}

当n=1时,perm{E}={e},只有一种组合
当n>1时,perm{E}=e1.perm{e1}+e2.perm{e2}+...en.perm{en}

递归定义结束。

例子:

当n=3, E={a,b,c}

perm{E}=a.perm({b,c})+b.perm({a,c})+c.perm({a,b})
perm({b,c})=b.perm({c})+c.perm({b})=bc+cb
perm({a,c})=a.perm({c})+c.perm({a})=ac+ca
perm({a,b})=ab+ba


当n=4,E={a,b,c,d}

perm{E}=a.perm{b,c,d}+b.perm({a,c,d})+c.perm({a,b,d})+d.perm({a,b,c})


  1. template<class T>
  2. inline void Swap(T &a, T &b)
  3. {
  4.     T temp = a;
  5.     a = b;
  6.     b = temp;
  7. }
  8. template<class T>
  9. void Perm(T list[], int k, int m)
  10. {//生成list[k:m]的所有排列方式
  11.     int i;
  12.     if (k == m)
  13.     { //输出一种
  14.         for (i=0; i<=m; i++)
  15.         {
  16.             cout << list[i];
  17.         }
  18.         cout << endl;
  19.     }
  20.     else
  21.     {// 找出list[k:m]的所有排列方式
  22.         for (i=k; i<=m; i++)
  23.         {
  24.             //循环次数为m-k+1次
  25.             //只变k~m范围的元素,0~k-1作为前缀不变
  26.             Swap(list[k], list[i]);
  27.             Perm(list, k+1, m);
  28.             Swap(list[k], list[i]);
  29.         }
  30.     }
  31. }