集合的全排列问题(递归实现)

设R={r1,r2,r3,.....rn}要进行全排列的n个元素,集合X中元素的全排列记为perm(X),则(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列定义可归纳定义如下:

当n=1时,perm(R) = (r),其中r为集合R中唯一元素

当n>1时,perm(R)由(r1)perm(R1)、(r2)perm(R2).........构成

因此可以设计全排列的递归算法;

//产生元素k—m的全排列,作为k-1个元素的后缀
void Perm(int list[], int k, int m){
    //构成一次全排列,输出结果
    if( k == m ){
        for( int i = 0; i < m; i++ )
            cout<<list[i]<<" ";
        cout<<endl; 
    }
    else{
        //在数组list中,产生元素k—m的全排列
        for( int j = k; j <= m; j++){
            swap(list[k],list[j]);
            Perm(list,k+1,m);
            swap(list[k],list[j]);
        } 
    } 
} 

猜你喜欢

转载自www.cnblogs.com/geziyu/p/9941161.html
今日推荐