递归求解n个数的r组合
时间: 2023-12-12 16:05:28 浏览: 75
递归求解n个数的r组合可以使用回溯法来实现。具体步骤如下:
1. 定义一个数组来存储当前已经选取的r个数。
2. 编写一个递归函数,该函数传入三个参数:当前已经选取的数的个数k,要选取的总数r,以及当前已经选取的数的集合。
3. 在递归函数中,如果已经选取了r个数,则将当前已选数的集合加入结果集中,并结束递归。
4. 如果当前已选数的集合中还有空位,则从当前位置开始遍历待选数的数组,依次选取每个数,将其加入已选数的集合中,并递归调用函数,将k+1作为新的已选数的个数,r作为总数,已选数的集合作为新的集合传入递归函数。
5. 在递归函数返回时,将已选数的集合中最后一个数弹出,以便让下一个数来填补空位。
6. 最终结果集中即为n个数中选取r个数的所有组合。
以下是一个示例代码实现:
```
void combine(int k, int r, vector<int>& nums, vector<int>& cur, vector<vector<int>>& res) {
if (cur.size() == r) {
res.push_back(cur);
return;
}
for (int i = k; i < nums.size(); i++) {
cur.push_back(nums[i]);
combine(i+1, r, nums, cur, res);
cur.pop_back();
}
}
vector<vector<int>> nChooseR(int n, int r) {
vector<int> nums(n);
for (int i = 0; i < n; i++) {
nums[i] = i+1;
}
vector<vector<int>> res;
vector<int> cur;
combine(0, r, nums, cur, res);
return res;
}
```
其中,nChooseR函数返回n个数中选取r个数的所有组合。
阅读全文