递归循环嵌套排列组合

数组a中有n个字符元素,输出m(m<=n)个元素组成的所有组合。
例如n=3,m=2,a[0]='a',a[1]='b',a[2]=1时,输出为ab a1 b1
写程序输入n,m及a,输出所有组合

/*
    Name: 
    Copyright: 
    Author: malic答案 http://www.malic.xyz/ans839/2010/
    Date: 02/12/18 10:44
    Description: 本题的程序代码是所有元素均不相同的组合情况。
    如果要求从N个数中选M个数输出组合,
    M与N均是已知,那么写M重循环进行遍历就可以。
    但现在循环重数M不能预先知道,这种循环就不能实现。
    这时可以使用用递归,
    每次递归调用进行一重循环,直到循环层数达到要求,
    再输出结果。
    这个程序可以调试。 
*/
#include <stdio.h>
#define MAXN 20
int index[MAXN];
char a[MAXN];

void solve(int n,int m,int level)
{
   int i;
   if(m==level){/*此时index数组已经构建完成*/
    for(i=0;i<m;i++) printf("%c ",a[index[i]]);
    printf("
"); 
    }
   else{
    for(i=index[level-1]+1;i<n;i++){
    /*这里可以放心的使用i=index[level-1]+1;这一循环起点,因为在56出现过了时,
    再组合一次65绝对是重复了,所以index数组必然是一个首元素最小的数组,
    index[level]只可能比index[level-1]要大*/
       index[level]=i;
       solve(n,m,level+1);
    }
   }
}

int main()
{
   int i,n,m;
    
   scanf("%d%d",&n,&m);
   scanf("%s",a);/*a是一个字符数组,也可以当成字符串处理*/
   for(i=0;i<n;i++){/*绝妙*/
    index[0]=i;
    solve(n,m,1);
   }
   return 0;
}
原文地址:https://www.cnblogs.com/lingr7/p/10052726.html