C++递归算法求解组合数问题:从N个数中取出R个数的所有组合
C++递归算法求解组合数问题:从N个数中取出R个数的所有组合
在数学中,组合数是指从n个不同元素中取出r个元素的所有组合的个数。本文将介绍如何使用C++编写递归算法来生成从n个数中取出r个数的所有组合。
以下是使用C++编写的代码示例:
#include <iostream>
#include <vector>
using namespace std;
// 递归生成组合
void generateCombinations(vector<int>& nums, vector<int>& combination, int n, int r, int start) {
// 当组合的大小等于r时,输出组合并返回
if (combination.size() == r) {
for (int num : combination) {
cout << num << ' ';
}
cout << endl;
return;
}
// 从当前位置开始尝试添加数字到组合中
for (int i = start; i < n; i++) {
combination.push_back(nums[i]); // 添加当前数字到组合中
generateCombinations(nums, combination, n, r, i + 1); // 递归生成组合,下一个数字从i+1开始
combination.pop_back(); // 回溯,移除最后一个添加的数字
}
}
int main() {
int n, r;
cout << '请输入n: ';
cin >> n;
cout << '请输入r: ';
cin >> r;
// 构建数字数组
vector<int> nums(n);
for (int i = 0; i < n; i++) {
nums[i] = i + 1;
}
// 生成并输出所有的组合
vector<int> combination;
generateCombinations(nums, combination, n, r, 0);
return 0;
}
这段代码首先获取用户输入的n和r,然后构建一个包含1到n的数字数组。接下来,通过调用generateCombinations函数来生成所有的组合。
generateCombinations函数使用递归的方法来生成组合,其参数包括:
nums:包含所有数字的数组combination:当前的组合n:数字总数r:要选取的数字数量start:当前数字的起始位置
在每一次递归调用中:
- 函数首先检查当前组合的大小是否等于r,如果是,则输出组合并返回。
- 如果不是,它会从当前位置(
start)开始尝试添加数字到组合中,并递归调用自身以生成包含新添加数字的组合,下一个数字从i+1开始。 - 完成递归后,函数会回溯并移除最后一个添加的数字,以便下一次添加其他数字。
通过这种递归的方式,代码将生成并输出所有从n个数中取r个数的组合。
原文地址: https://www.cveoy.top/t/topic/O4N 著作权归作者所有。请勿转载和采集!