您的位置:首页 > 其它

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

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

#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,相同的位置分别存放各个位置
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: