C:编程从n数中抽出r个数的所有组合方式(递归)

前言

关于递归

正文

编程从n数中抽出r个数的所有组合方式
例如:从1,2,3,4中四个数抽三个数组合为:432,431,421,321
关键:下一个数的选取范围要在比上一个数小的数的集合中
例如,4个数中选3个,第一个数可以选4,3,第二个数可以选2(若选3),3(若选4),第三个数可以选1(若选2),2(若选3)。总之就是每次选后,剩下的数要不少于r-1,且下次选的数要小于本次选的数

代码

用数组b[]来储存选择数的下标号

#include 
void combine(int n,int r,int a[],int b[],int R);
int main(){
	int i,j;
	int n,r;
	int a[]={1,2,3,4}; //只能是1,2,3....n 
	scanf("%d%d",&n,&r);
	int b[r];
	combine(n,r,a,b,r);
}
void combine(int n,int r,int a[],int b[],int R){
	int i,j;
	if(r==0){ //递归跳出条件,待组合数为0
		 i=0;
		for(i=0;i<R;i++){
			printf("%d",a[b[i]]);
		}
		printf("\n");
	}
	else{
		for( j=n;j>=r;j--){
			b[r-1]=j-1;		//b用来储存组合数中每个选择出数的下标 
			combine(j-1,r-1,a,b,R);//递归体每次完成一个数的选取
		}
	}
}

你可能感兴趣的:(南师大科一习题)