递归)"/>
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 <stdio.h>
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){ //递归跳出条件,待组合数为0i=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);//递归体每次完成一个数的选取}}
}
更多推荐
C:编程从n数中抽出r个数的所有组合方式(递归)
发布评论