生成全子集组合排列(不含空集)
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,相同的位置分别存放各个位置
}
}