递归函数,用于使用位掩码 c++ 显示集合的所有子集

Recursive function to display all subsets of a set using bitmask c++

本文关键字:集合 显示 子集 c++ 掩码 用于 递归函数      更新时间:2023-10-16

我正在尝试编写一个递归函数,以使用位掩码显示n元素集的所有可能的k元素子集。

到目前为止,我有这个代码。

#include <iostream>
using namespace std;
void combinations(int *, int, int, int,int c);
int main()
{
    int n = 5;
    int k = 3;
    int bitMask[5] = {0};
    combinations(bitMask,0,n,k,0);
}
void combinations(int* arr, int start, int n, int k,int c)
{
    if(c==3)
    {
        for(int i = 0; i < n; i++)
        {
            cout<<arr[i];
        }
        cout<<endl;
    }else
    {
        for(int i = start; i < n; i++)
        {
            arr[i] = 1;
            combinations(arr,i+1,n,k,c+1);
        }
    }
}

但是我的输出是:

11100
11110
11111
11111
11111
11111
11111
11111
11111
11111

有人可以给我一些关于如何更改函数以获得这样的结果的指导方针

11100
11010
11001
10110
10101
01110
01101
01011
00111

提前感谢,我仍然对递归很糟糕。

下面的代码运行良好。

  #include <iostream>
    using namespace std;
    void combinations(int *, int, int, int,int c);
    int main()
    {
        int n = 5;
        int k = 3;
        int bitMask[5] = {0};
        combinations(bitMask,0,n,k,0);
    }
    void combinations(int* arr, int start, int n, int k,int c)
    {
        if(c==3)
        {
            for(int i = 0; i < n; i++)
            {
                cout<<arr[i];
            }
            cout<<endl;
        }else
        {
            for(int i = start; i < n; i++)
            {
                arr[i] = 1;
                combinations(arr,i+1,n,k,c+1);
                arr[i] = 0;
            }
        }
    }

你忘了

    arr[i] = 0;

从递归combinations()返回后。