求全排列一(递归法)

思想:对于数列,设其全排列用集合表示。其全排列集合可以用一种递归方式定义:



其中,表示以开头的所有全排列集合。

 

程序实现可以用递归实现,代码如下:

void print_it( int arr[],  int n);
void arrange_all( int arr[],  int size,  int pos);
void swap( int& a,  int&b);

int main()
{
     int a[ 4] = { 1234}; 
    arrange_all(a,  40); 
     return  0
}
/*
 函数名: void arrange_all( int  arr[], int  size,  int  pos)    
 描述:    打印所有排列  
 参数:    arr[]  排列存放的数组
        size   要排列的数据个数           
        pos    当前排列位置  
*/
void arrange_all(  int arr[],  int size,  int pos) 
{

     int i, tmp; 
     if (pos +  1== size)  // 如果已经排到最后
    {
        print_it(arr,size);  //  打印数组
         return
    }
     for (i = pos; i < size; i++)  // 对当前位置后的所有位置排列
    {
        swap(arr[pos],arr[i]); //  交换
        arrange_all(arr, size, pos +  1);  // 递归,继续后面的调用
        swap(arr[pos],arr[i]); //  再交换回来,保持原有的排列次序

    }
}
/*
 函数名: print_it(int arr[], int n)   
 描述:    打印数组
 参数:    arr[]  需要打印的数组
        n   数组的长度 
*/
void print_it( int arr[],  int n) 
{
     int  i;
     static  int cnt =  0
    printf( " %04d:  ", ++cnt); 
     for (i =  0; i < n; i++) 
        printf( " %2d  ", arr[i]); 
    printf( "  \n "); 
}
/*
 函数名: swap(int &a,int&b)   
 描述:    交换
*/
void swap( int &a, int&b)
{
     int tmp = a;
    a=b;
    b=tmp;
}

 

转载于:https://www.cnblogs.com/ziqiao/archive/2012/09/30/2709201.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值