组合算法-递归实现

假设在n个数中选取m(0<m<=n)个数为例,可以假这个问题划分为下面两个问题:

  1. 从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数。
  2. 从n个数中选取编号更小的一个数,继续执行第一步,直到当前可选编号最大的值为m。

下面是递归方法的实现:
/// 求从数组a[1..n]中任选m个元素的所有组合。
/// a[1..n]表示候选集,m表示一个组合的元素个数。
/// b[1..M]用来存储当前组合中的元素, 常量M表示一个组合中元素的个数。
void combine( int a[], int n, int m,  int b[],int M )
{
	int i = 0;
	for(i=n; i>=m; i--){
		b[m-1] = i - 1;
		if (m > 1){
			combine(a,i-1,m-1,b,M);
		}else{
			int j=0;
			for(j=M-1; j>=0; j--)
				printf("%d,",a[j]);
			printf("\n");
		}
	}
}

你可能感兴趣的:(组合算法-递归实现)