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:当前数字的起始位置

在每一次递归调用中:

  1. 函数首先检查当前组合的大小是否等于r,如果是,则输出组合并返回。
  2. 如果不是,它会从当前位置(start)开始尝试添加数字到组合中,并递归调用自身以生成包含新添加数字的组合,下一个数字从i+1开始。
  3. 完成递归后,函数会回溯并移除最后一个添加的数字,以便下一次添加其他数字。

通过这种递归的方式,代码将生成并输出所有从n个数中取r个数的组合。

C++递归算法求解组合数问题:从N个数中取出R个数的所有组合

原文地址: https://www.cveoy.top/t/topic/O4N 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录