生成集合的所有组合 - 递归法
2013-10-14 23:20
162 查看
题目描述
输入一个集合,需要生成该集合所能得出的所有组合。举例说明:若输入集合为{1,2} , 需要生成的组合有{1},{1, 2},{2} 。该题目与生成集合的全排列有很多相似之处,同样也是一个很经典的问题。
解决思路
这里我们利用递归的思想来实现该问题的解。
面对这样一个问题,我们需要仔细分析。题目要求生成一个集合的所有组合,也就是需要生成集合里的元素所能够组成的所有组合。于是一个很明显的思路就是要遍历该集合。一提到遍历集合,可以使用循环或者递归来实现。针对本问题,利用递归的思想是很方便的。
假设我们的集合为{1,2,3} ,我们从头扫描集合的元素,第一个元素为1。对于这个元素,我们可以把他放到组合集中,然后在剩下的集合里再去选择;也可以不把他放到组合集中,在剩下的集合里去选择元素放到组合集中。一般化的,假设我们的集合有n个元素,要求m个元素的组合。我们扫描每一个元素,针对该元素,我们可以将其放到组合集中,然后在剩下的n-1个元素中再选择m-1个元素;我们也可以不放该元素进集合,而直接从剩下的n-1个元素中选择m个元素。这已经是非常清晰的递归的思想了,具体代码如下。
代码
小结
递归生成集合的所有组合,是考验一个程序员基本功的问题,有一些技巧性。本问题与Gray Code按序生成集合子集属于同一个问题的不同实现方法,都是很经典的解题方法。
输入一个集合,需要生成该集合所能得出的所有组合。举例说明:若输入集合为{1,2} , 需要生成的组合有{1},{1, 2},{2} 。该题目与生成集合的全排列有很多相似之处,同样也是一个很经典的问题。
解决思路
这里我们利用递归的思想来实现该问题的解。
面对这样一个问题,我们需要仔细分析。题目要求生成一个集合的所有组合,也就是需要生成集合里的元素所能够组成的所有组合。于是一个很明显的思路就是要遍历该集合。一提到遍历集合,可以使用循环或者递归来实现。针对本问题,利用递归的思想是很方便的。
假设我们的集合为{1,2,3} ,我们从头扫描集合的元素,第一个元素为1。对于这个元素,我们可以把他放到组合集中,然后在剩下的集合里再去选择;也可以不把他放到组合集中,在剩下的集合里去选择元素放到组合集中。一般化的,假设我们的集合有n个元素,要求m个元素的组合。我们扫描每一个元素,针对该元素,我们可以将其放到组合集中,然后在剩下的n-1个元素中再选择m-1个元素;我们也可以不放该元素进集合,而直接从剩下的n-1个元素中选择m个元素。这已经是非常清晰的递归的思想了,具体代码如下。
代码
void combination(char *src,int num, vector<char>& result) { if(num==0) { vector<char>::iterator iter=result.begin(); for(;iter<result.end();iter++) { printf("%c",*iter); } printf("\n"); return; } if(*src=='\0') return; result.push_back(*src); combination(src+1,num-1,result); result.pop_back(); combination(src+1,num,result); } void all_sub_set(char *src) { assert(src); if(!src) return; int i=0; int len=strlen(src); vector<char> result; for(i=1;i<=len;i++) { combination(src,i,result); } }
小结
递归生成集合的所有组合,是考验一个程序员基本功的问题,有一些技巧性。本问题与Gray Code按序生成集合子集属于同一个问题的不同实现方法,都是很经典的解题方法。
相关文章推荐
- 【转】递归生成集合的所有组合
- 用递归法来实现字符集合的所有组合
- 生成集合的所有组合 - Gray Code
- 算法——递归生成集合的所有组合
- 给定一列字符,生成指定长度的所有可能的组合
- 生成集合[n]的所有k-子集MATLAB代码
- python3.6深度学习图片集处理项目源代码(为cnn等准备图片集合,批量生成、删除、改名、旋转、调整图片大小,包括删除指定路径下所有文件)
- 深度优先算法求含有N个元素的集合的全部组合(即:在集合中选1,2,3...N个元素的所有组合,不是排列)
- 运用二进制生成集合的所有子集
- 给定n对括号,编写一个函数来生成正确括号的所有组合。
- Java实现集合的组合(从组合中取出K个元素进行组合的所有情况)
- C#实现生成所有不重复的组合功能示例
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)
- 输出给定集合的所有排列与组合-python
- 福彩双色球中红球由6个1-33之间的数字组合,且不重复,编写代码,使用Set集合来存储随机生成的1-33的数字,然后输出生成的数字
- 生成所有不重复的组合
- 根据集合排列出所有可能组合
- 怎么计算一个集合的幂集(所有子集形成的集合)的长度?涉及组合数学基础
- 每日一省之————递归法计算数组的所有排列组合
- python把list的所有元素生成排列和组合