编写一个递归算法,找出从自然数1,2,3,…,n中任取r个数的所有组合。例如n=5,r=3时所有组合为543,542,541,532,531,521,432,431,421,321。![](https://i-blog.csdnimg.cn/blog_migrate/99c10cb4c744748a19bf103daf1ac854.jpeg)
若设这n个自然数存放在整数数组A[n]中,A[i]中存放整数i+1(0≤i≤n-1)。
为求从这n个自然数中任取r个数的组合,可采用递归方法 comb(A,n,r)。
例如当n=5,r=3时,首先确定第一个数,如5,再从比它小的剩余的n一1个数中取r一1个数的组合comb(A,n—1,r一1),
即可得到以5开始的全部所要求的组合;
然后再轮流以4,3开始,依此办理,就可得到全部所要求的组合。
递归算法的描述如下。
#include<iostream>
using namespace std;
void comb(int A[], int m, int n, int r) {
//从A[]中的前m个整数中任取n个整数的所有组合,
//r在最初调用时 =n,是为了控制输出使用的。
int i, j;
for (i = m;i >= n;i--) {
A[n - 1] = i;
if (n > 1) {
comb(A, i - 1, n - 1, r);
}
else {
for (j = r - 1;j >= 0;j--) {
cout << A[j];
}
cout << endl;
}
}
}
int main() {
int A[5];
for (int k = 0;k < 5;k++) {
A[k] = k + 1;
}
comb(A, 5, 3, 3);
}