集合幂集

Description

设S是有n(n≤20)个元素的集合,S的幂集是S所有可能的子集组成的集合。例如,S={a,b,c},则S的幂集={()(c)(b)(bc)(a)(ac)(ab)(abc)}。写一个C++递归程序,以S为输入,输出S的幂集。

Input

n(n≤20)的值以及S的n个元素

Output

S的幂集

Sample Input

3

abc

Sample Output

()(c)(b)(bc)(a)(ac)(ab)(abc)


分析:我们知道含有n个元素的集合它的子集一共有2的n次方个,这个方法如果用递归来做的话,考虑一下每次函数只输出一个子集的话,可以选择如下方法:设计一个具有n层递归的函数,每个递归函数则需要再包含两个递归原函数,分成两路,这样可以达到一共2的n次方的输出。如果用二叉树的思想来想这道题的话会更方便,每次把目标函数分成两个子问题,就像一颗二叉树一样。


本题也是本人在网上搜的,也搜集了同班同学的各种思想,自己再总结了一下,其中加上自己的一些理解,如有错误,请各位帮忙指出!

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4. char array[21];  
  5. void Func(int i,char *Temp)  
  6. {  
  7.     char reTemp[21];//这里需要设置另一个替换数组,因为如果if判断语句成立的话,就要输出Temp,如果Temp在下面的环节修改的话,那输出的集合也不是目标集合  
  8.     strcpy(reTemp,Temp);  
  9.     if(i==strlen(array))  
  10.     {  
  11.         cout<<"("<<Temp<<")";  
  12.         return ;  
  13.     }  
  14.     else  
  15.     {  
  16.         Func(i+1,reTemp);  
  17.         strncat(reTemp,(array+i),1);//这个函数是将第二个数组从第i个位置后将1位字符赋值到reTemp中  
  18.         Func(i+1,reTemp);  
  19.         /*本题最关键的也就是在这里讲一个函数递归成两个,第二个递归需要将第一个递归的数组reTemp附上新元素再递归, 
  20.         就像二叉树一样一直分支下去,直到return*/  
  21.     }  
  22. }  
  23. int main()  
  24. {  
  25.     int n;  
  26.     char Temp[21]={0};  
  27.     cin>>n>>array;  
  28.     Func(0,Temp);  
  29.     return 0;  
  30. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值