关于递归
编程从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);//递归体每次完成一个数的选取
}
}
}