2014-09-29 79 views
0

,我发现这个迭代算法打印power set一组给定:说明迭代算法的打印发电机组

void PrintSubsets() 
{ 
    int source[3] = {1,2,3}; 
    int currentSubset = 7; 
    int tmp; 
    while(currentSubset) 
    { 
     printf("("); 
     tmp = currentSubset; 

     for(int i = 0; i<3; i++) 
     { 
     if (tmp & 1) 
     printf("%d ", source[i]); 
     tmp >>= 1; 
     } 
     printf(")\n"); 
     currentSubset--; 
    } 
} 

不过,我不知道为什么它的工作原理。是否类似于您使用一组n位的解决方案,并且在每一步中,使用重复使用零和1的模式来确定哪些元素属于?

+2

是的,它就像你所描述的使用加法的情况,除了这个使用减法。请注意,此实现无法输出空集。 – 2014-09-29 23:29:04

+0

@GregHewgill现在得到它。随意发布,作为答案,我会接受它。 – 1110101001 2014-09-29 23:40:23

回答

1

列表在二进制的所有整数,且光线应亮:

{abc} 
7 xxx 
6 xx- 
5 x-x 
4 x-- 
3 -xx 
2 -x- 
1 --x 
0 --- (omitted) 

的顺序来枚举整数无所谓只要你一一列举。递增或递减是最自然的方式。

+0

小挑战:按灰色顺序列出分区,即每次更改一位:111,110,100,101,001,011,010,000。按顺序执行此操作。 – 2014-09-30 06:55:33