集合的幂集(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次方的输出。如果用二叉树的思想来想这道题的话会更方便,每次把目标函数分成两个子问题,就像一颗二叉树一样。
本题也是本人在网上搜的,也搜集了同班同学的各种思想,自己再总结了一下,其中加上自己的一些理解,如有错误,请各位帮忙指出!
设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++求集合幂集 源代码及算法优化
- c++求集合的幂集-递归实现
- C++ 递归艺术----求任意集合的幂集组合和子集合的总个数
- 打印一个集合的幂集C++实现
- C++中的优秀C++编译器大集合
- C++ STL入门教程(7)——multimap(一对多索引),multiset(多元集合)的使用(附完整程序代码)
- C++学习:双向链表List(集合)
- C++ STL set集合容器常用用法
- C++ 字符串操作函数集合(部分)
- C++关联容器类:集合和多重集合类、映射和多重映射类
- [C/C++标准库]_[初级]_[集合操作]
- C++ STL学习笔记八 multiset多重集合容器
- c++错误集合
- Github干货系列:C++资源集合
- 回溯法之求n个集合的幂集
- C++ STL set集合容器常用用法
- C++程序员学Java系列之十六:ArrayList 集合
- C++程序题改错题类型集合
- multiset 多重集合容器 C++容器 学习笔记
- 离散数学中集合的相关代码C++