2013_11_14:递归算法(2)—全排列

3.经典例题递归

   设R = {r1,r2,r3......rn}是要进行排列的n个元素,Ri = R-{ri}。集合X中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每个排列前加上前缀ri获得的排列。R的全排列可概括定义以下:element

   当n = 1时,Perm(R) = (r),其中r是结婚R中惟一的元素。it

   当n > 1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2)......(rn)Perm(Rn)构成。其实这就是一个递归过程,拿(r1)Perm(R1)来讲,全排列Perm(R1) = Perm( {r2,r3,r4.....rn})以后再在全部排列以前加上r1就能够了,其中{r2,r3,r4.....rn}又是一个新的集合,能够由(r2)Perm({r3,r4....rn}),(r3)Perm({r2,r4....rn})......表示,一直递归下去,直到最后Perm({rx})也就是只剩下一个元素时全排列也就是本身了rx,而后再逐步返回加上前面的前缀,这就是(r1)Perm(R1)。class

  template <class Type>集合

 void Perm(Type list[] int prefix,int length)co

{void

       if(prefix == length)//it means there is an element

       {

               for(int i=0;i<=length;++i)

                      cout<<list[i]<<endl;//print the value of list

        }else{

              for(int j = prefix;j<=length;++j)

             {

                    exchange(list[prefix],list[j]);//exchange the value of list[prefix] and list[j]

                    Perm(list,perfix+1,length);

                    exchange(list[prefix],list[j]);

              }

         }

}

相关文章
相关标签/搜索