写一个递归函数,用来输出n个元素的所有子集。

来源:互联网 发布:网络电子游艺坑人 编辑:程序博客网 时间:2024/06/04 20:14

题目描述:

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

问题分析:

既然是求子集,我们可以采用对其标记的思路,“1”表示输出,“0”表示不输出。(全为“1”则代表该子集全集,全为“0”则代表该子集为空集)
所以我们遍历所有元素,代码如下:
#include <iostream>
#include
"Header.h"
using namespace std;
template<typenameT>
void f(T *a,int *mark,int n,int i)
{//a为集合元素,mark为标记数组,n为起点,i为元素个数
      if(n==i)
      {
           
cout<<"{";
           
for(intk=0;k<i;k++)      
            {
                 
if(mark[k]==1)
                       
cout<<a[k];
            }
           
cout<<"}"<<endl;
            return ;
      }                            
                                                                   
      mark[n]=0;                       
      f(a,mark,n+1,i);                        
      mark[n]=1;             
      f(a,mark,n+1,i);                         
 }                                  
int main()
{
     
int mark[3];
     
char a[3]={'a','b','c'};
     
f(a,mark,0,3);
}
编译结果如下:

{}

{c}

{b}

{bc}

{a}

{ac}

{ab}

{abc}

用图示更清晰

                                                              
      mark[n]=0;                       
      f(a,mark,n+1,i);                        
      mark[n]=1;             
      f(a,mark,n+1,i); 



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




1 0