【备战2014笔面试】递归的应用-排列组合的实现

1.有重复的排列问题

例题:用3,2,1这三个数字组成一个4位数,数字可以重复。

这里显然有3的4次方种可能性,可以用递归实现如下:

void quanpailie1(int a[],int i,int n)
    {
         //i = n 则说明其排列结束可以输出
         if(i == n)
         {
              for(int i = 0;i < n; i++)
              {
                      cout << a[i] ;
              } 
                           
              count++;              
              cout<<endl; 
         }
         else
         {
             //这里分三种情况进行全排列
             a[i] = 1;
             quanpailie1(a, i + 1, n);
             
             a[i] = 2;
             quanpailie1(a, i + 1, n);
             
             a[i] = 3;
             quanpailie1(a, i + 1, n);             
             
         }
    }

    int main()  
    {          
        int a[4];
        
        quanpailie1(a, 0, 4);
        cout<< "共 " << pailie_num << " 种可重复排列!" <<endl;  
               
        system("PAUSE");          
        return 0;  
    }  


2.生成全子集的组合问题

例题有{a1,a2,...,an}数组,试输出该数组的所有组合。

这里可得每一个数均有放入子集和不放入子集两种情况。

故共有2的n次方种子集(包含空集),若不包含空集则有2的n次方减一种情况

Sample Input

4

1 2 3 4

Sample Output

1

12

123

1234

124

13

134

14

2

23

234

24

3

34

4

    //这里a[]表示的是选择情况,
    //a[i] = 0 表示a2[i]不选择,a[i] = 1 表示a2[i]选择 
    void quanzuhe(int a[],int i,int n,int a2[])
    {
         if(i == n)
         {
              int num = 0;              
              for(int i = 0;i < n; i++)
              {               
                      if(a[i] == 1) 
                      {       
                              cout << a2[i];
                              num++;
                      } 
              }                                         
              if(num != 0) cout<<endl; 
         }
         else
         {
             a[i] = 1;
             quanzuhe(a, i + 1, n, a2);
             
             a[i] = 0;
             quanzuhe(a, i + 1, n, a2);         
             
         }
    }

    int main()  
    {  
                
        int a[3];
        int a2[3] = {1,2,3};
        
        quanzuhe(a, 0, 3, a2);
               
        system("PAUSE");          
        return 0;  
    } 


3.生成指定个数的组合问题

例如{1,2,3,4,5}中选择三个,可以使用上面的代码稍加修改即可实现

    
    //这里m表示需要从中选择几个
    void zuhe(int a[],int i,int n,int a2[], int m)
    {
         if(i == n)
         {
              int num = 0;              
              for(int i = 0; i < n; i++)
              {               
                      if(a[i] == 1) 
                      {       
                              num++;
                      } 
              }
                                                       
              if(num == m)
              {
                     for(int i = 0; i < n; i++)
                     {               
                                     if(a[i] == 1) 
                                      {       
                                              cout<<a2[i];
                                      } 
                     }
                     cout<<endl;
              }
              
             
         }
         else
         {
             a[i] = 1;
             zuhe(a, i + 1, n, a2, m);
             
             a[i] = 0;
             zuhe(a, i + 1, n, a2, m);         
             
         }
    }

    int main()  
    {          
        int a[5];
        int a2[5] = {1,2,3,4,5};
        
        zuhe(a, 0, 5, a2, 3);
               
        system("PAUSE");          
        return 0;  
    }  
 


4.全排列问题

    
    static int g_sCnt = 0;  

    //permutation的重载版本.  
    void permutation(char* pStr, char* pBegin)  
    {  
           if(*pBegin == '\0')  
           {  
                  ++g_sCnt;  
                  cout << pStr << endl;  
           }  
           else  
           {  
                  for(char* pCh = pBegin; *pCh != '\0'; ++pCh)  
                  {  
                         //从第一个字符依次和后面的字符进行交换.  
                         char temp = *pCh;  
                         *pCh = *pBegin;  
                         *pBegin = temp;  
       
                         permutation(pStr,pBegin+1);  
                          
                         //交换回原样,以便再递归处理后面的字符.  
                         temp = *pCh;  
                         *pCh = *pBegin;  
                         *pBegin = temp;  
       
                  }//end for  
           }//end else  
    }  
    
    //全排列处理函数  
    void permutation(char* pStr)  
    {  
        if(pStr== NULL)  
            {  
                  return;  
            }  
           else  
            {  
                  permutation(pStr,pStr);  
            }  
    }  
       
    int main()  
    {  
        char strSrc[] = "abc";  
        permutation(strSrc);  
        cout<< "共 " << g_sCnt << " 种排列!" <<endl;  
               
        system("PAUSE");          
        return 0;  
    }  










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值