您的位置:首页 > 编程语言 > C语言/C++

集合的幂集(C++)

2014-02-22 20:31 288 查看
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;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 递归 二叉树