递归地生成子集

generate subsets recursively

本文关键字:子集 递归      更新时间:2023-10-16

我试图为大小为3的特定bool向量生成所有可能的子集。所以应该有8个可能的子集:

#include<iostream>
#include<fstream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
int n = 3;
int mis(vector<bool> f,int i){
        for(int j=0; j <f.size();j++)
            cout<<f[i]<<" ";
        cout<<endl; 
        f[i] = false;
        return mis(f,i+1);
        f[i] = true;
        return mis(f,i+1);
}
int main(){
    vector<bool> f;
    f.resize(n);
    int m = mis(f,0);
}

我得到以下错误:

a.out: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted

事实上你犯了几个错误。下面是正确的代码:

#include<iostream>
#include<fstream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
int n = 3;
int mis(vector<bool> f, int i)
{
    if (i > n)
    {
        return 0;
    }
    else if (i == n)
    {
        for(int j = 0; j < n; j += 1)
        {
            cout << f[j] << " ";
        }
        cout << endl;
        return 1;
    }
    f[i] = false;
    int a = mis(f, i + 1);
    f[i] = true;
    int b = mis(f, i + 1);
    return a + b;
}
int main()
{
    vector<bool> f(n);
    int m = mis(f, 0);
    cout << "Total: " << m << endl;
}
  1. 在打印vector内容的循环中,您使用变量j,但打印f[i]。我相信这就是你得出结论的原因。

  2. 代码f[i] = true; return mis(f, i + 1); 不可达。您应该像我一样使用变量来记住中间结果。

  3. 递归中没有出口。你从不检查i是否太大

您没有递归的基本情况。在打印endl之后,需要检查是否完成:

...
cout << endl;
if (i == n)
    return;
...