递归学习_组合_生成全子集组合排列(不含空集)

 

生成全子集组合排列(不含空集)

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,相同的位置分别存放各个位置
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值