使用递归函数,输出n个元素的所有子集

题目描述:

请编写一个递归函数,用来输出n个元素的所有子集。例如,三个元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.

 

解题思路:

根据子集的定义,集合中的每一个元素在子集中都有两种状态:‘1’表示出现,'0'表示不出现;如果所有的元素都不出现,则该子集是空集,如果所有的元素都出现,则该子集是全集。

我们定义一个标记数组tag,用于记录集合中对应的元素是否出现,每层遍历对应集合中的每个元素,都有出现(为‘1’)和不出现(为‘0’)两种可能,一直遍历到所有的元素的可能都标记完,然后根据数组函数输出结果。

 

程序代码:

 

  1. #include <iostream>  
  2. using namespace std;  
  3. void build(char *str,int *tag,int n)  
  4. {  
  5.     if(n==5)  
  6.     {  
  7.         cout<<"{";  
  8.         for(int i=0;i<5;i++)  
  9.             if(tag[i]==1)  
  10.                 cout<<str[i];  
  11.         cout<<"}"<<endl;  
  12.         return;  
  13.     }  
  14.     tag[n] = 0;  
  15.     build(str,tag,n+1);  
  16.     tag[n] = 1;  
  17.     build(str,tag,n+1);  
  18. }  
  19. int main()  
  20. {  
  21.     char a[5]={'a','b','c','d','e'};  
  22.     int tag[5];  
  23.     build(a,tag,0);  
  24.     return 0;  
  25. }  

 

输出结果:

{}
{e}
{d}
{de}
{c}
{ce}
{cd}
{cde}
{b}
{be}
{bd}
{bde}
{bc}
{bce}
{bcd}
{bcde}
{a}
{ae}
{ad}
{ade}
{ac}
{ace}
{acd}
{acde}
{ab}
{abe}
{abd}
{abde}
{abc}
{abce}
{abcd}
{abcde}

一共有2^5 = 32个子集。

这是《数据结构与算法应用》中的一道课后题,看了作者的标准答案:http://www.mhhe.com/engcs/compsci/sahni/c1/E5.HTM

发现和我的思路是一样的,哈哈,英雄所见略同~

posted @ 2017-09-25 15:28  天涯海角路  阅读(574)  评论(0)    收藏  举报