递归学习_组合_生成全子集组合排列(不含空集)
2011-09-25 23:13
267 查看
生成全子集组合排列(不含空集)
Sample Input
4
1 2 3 4
Sample Output
1
12
123
1234
124
13
134
14
2
23
234
24
3
34
4
Sample Input
4
1 2 3 4
Sample Output
1
12
123
1234
124
13
134
14
2
23
234
24
3
34
4
#include <iostream> using namespace std; const int len=10; //为了让递归函数的参数更加简洁,把这些定义为全局变量 int n;//数据长度 int mat[len];//原数组 int result[len];//输出数组 void solve(int cur_totalVar,int nextVar); int main() { cin>>n; for (int i=0;i<n;i++) { cin>>mat[i]; } solve(0,0); system("pause"); return 0; } /*---------------------- 操作的目的:生成全子集组合排列(不含空集) 初始条件:mat数组存储原集合,result数组存储集合(结果) 操作结果:输出全部子集 函数思想:使用for循环遍历原存储数据的数组mat,边遍历边对输出数组result赋值,同时进行递归. 忽略递归,从for循环来看,存储数组中要存放数据的位置cur_totalVar是固定的,使用for循环对result进行赋值,这样就可以让输出数组中同一个位置有多个变化的变量。这时,在看递归,当结果数组的cur_totalVar位置已经赋值成功后,之后应该是对结果数组result的cur_totalVar+1的位置使用原数组mat的i+1位置的数据进行赋值(第i个数据已经赋过值了) 函数参数: cur_totalVar:针对输出数组result,表示现在要存放数据的位置,之后也控制着输出 nextVar:针对原存储数组mat,表示下一个要读取数据的位置 ------------------------*/ void solve(int cur_totalVar,int nextVar) { for (int i=0;i<cur_totalVar;i++) { cout<<result[i]; } cout<<endl; for (int i=nextVar;i<n;i++) { result[cur_totalVar]=mat[i]; solve(cur_totalVar+1,i+1);//易错的地方,递归的时候使用i+1,相同的位置分别存放各个位置 } }
相关文章推荐
- 递归求解几类排列组合问题(五、生成全子集组合排列)
- 递归求解几类排列组合问题(六、非重复生成全子集组合排列)
- 递归学习_组合_类循环组合排列
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法,通过数值跟踪保存排序过程
- 递归的思想生成排列组合
- 非重复生成全子集组合排列(含重复数字时,生成不重复全子集组合排列)
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法
- 递归学习_组合_普通选择性组合排列
- 排列组合,子集生成问题,与nyoj 组合数
- 递归学习_组合_全组合排列
- 生成可重复的排列(递归)
- 一个排列、组合的生成算法 [zz]
- 组合优化学习笔记<之>从贪心算法到子集系统再到拟阵
- jQuery递归遍历JSON树,生成对应的ul-li组合,形成树形菜单
- 学习笔记-排列组合问题
- 排列组合递归和非递归算法总结篇
- 9.9递归和动态规划(五)——确定某字符串的全部排列组合
- 算法学习-组合问题递归解法
- 递归专题-排列组合问题
- Water Gate Management(二进制枚举组合排列模板 n个数的子集)