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次方的输出。如果用二叉树的思想来想这道题的话会更方便,每次把目标函数分成两个子问题,就像一颗二叉树一样。
本题也是本人在网上搜的,也搜集了同班同学的各种思想,自己再总结了一下,其中加上自己的一些理解,如有错误,请各位帮忙指出!
- #include <iostream>
- #include <cstring>
- using namespace std;
- char array[21];
- void Func(int i,char *Temp)
- {
- char reTemp[21];//这里需要设置另一个替换数组,因为如果if判断语句成立的话,就要输出Temp,如果Temp在下面的环节修改的话,那输出的集合也不是目标集合
- strcpy(reTemp,Temp);
- if(i==strlen(array))
- {
- cout<<"("<<Temp<<")";
- return ;
- }
- else
- {
- Func(i+1,reTemp);
- strncat(reTemp,(array+i),1);//这个函数是将第二个数组从第i个位置后将1位字符赋值到reTemp中
- Func(i+1,reTemp);
- /*本题最关键的也就是在这里讲一个函数递归成两个,第二个递归需要将第一个递归的数组reTemp附上新元素再递归,
- 就像二叉树一样一直分支下去,直到return*/
- }
- }
- int main()
- {
- int n;
- char Temp[21]={0};
- cin>>n>>array;
- Func(0,Temp);
- return 0;
- }