递归地生成子集
generate subsets recursively
我试图为大小为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;
}
在打印
vector
内容的循环中,您使用变量j
,但打印f[i]
。我相信这就是你得出结论的原因。代码
f[i] = true; return mis(f, i + 1);
不可达。您应该像我一样使用变量来记住中间结果。递归中没有出口。你从不检查
i
是否太大
您没有递归的基本情况。在打印endl
之后,需要检查是否完成:
...
cout << endl;
if (i == n)
return;
...
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 使用递归从子集和中查找最大和
- 有人可以解释递归时如何找到所有子集
- 递归生成给定子集大小 (C++) 的所有组合
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 使用递归 C++ 进行子集验证
- 为什么这种递归子集和算法会导致指针分配错误
- 生成给定集合的子集(使用递归)的程序的执行涉及哪些步骤
- 使用递归 C++ 返回数组的子集
- 使用递归查找所有可能的子集对
- C++子集和2^n/递归错误/澄清
- 使用递归的子集总和
- 使用 c++ 的子集和递归
- 修改递归子集求和算法
- 递归地生成子集