以下是我写的程序,改了好久到底不知道是哪里出错了。
我怀疑是elements_count和curr_index这两个变量没有控制好。
/*Subset Generation.*/
/*其实就是一个完全二叉树忽略根节点的的深度优先遍历。*/
/**
elements_count : 数组的元素个数。
subsets : 输出参数。输出所有子集的数组。每个元素的形式为010 001 100等。
subsets_size : subsets 的长度(我感觉用不着把这参数传进来)。
curr_index : 用于递归。代表生成的第几个子集。是数组subsets的下标。
*/
void subset(int elements_count, int*& subsets, uint16_t subsets_size, uint16_t curr_index = 0)
{
/*向每一个子集后添加0 / 1*/
for (int i = 0 ; i < 2 ; i++)
{
subsets[curr_index] |= i;
/*是否将subsets[curr_index]的所有0、1添加完。*/
if (elements_count > 1)
{
/*左移1位准备下次处理。*/
subsets[curr_index] <<= 1;
/*递归。*/
subset(elements_count - 1, subsets, subsets_size, curr_index);
}
/*如果完成,则curr_index++,处理下一个元素。*/
else
{
++curr_index;
subsets[curr_index] = 0;
}
/*如果curr_index已经达到了subsets_size,则表示所有子集已经生成。*/
if (curr_index >= subsets_size)
{
return;
}
}
}