一、题目描述

通过使用分治策略,打印一个数组元素的所有子集
输入:1 2 3
输出:
1 2 3
1 2
1 3
1
2 3
2
3

二、解题思路

通过这个程序的思路进行分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void fun(int i, int n)
{
if(i >= n) return;
else
{
fun(i + 1, n);
fun(i + 1, n);
}
}

int main()
{
fun(0, 3);
}

上述程序的递归活动如下
在这里插入图片描述
我们在递推的过程中将brr[i] = 1; 回归的过程中将brr[i] = 0; 最终通过brr[i] == 1 ? 打印 : 不打印;
在这里插入图片描述

三、代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//打印子集
#if 1
void PrintSon(int* arr, int* brr,int left, int right)
{
if (left >= right)
{
for (int i = 0; i < right; ++i)
{
if (brr[i] == 1)
{
cout << arr[i] << " ";
}
}
cout << endl;
}
else
{
brr[left] = 1;
PrintSon(arr, brr, left + 1, right);
brr[left] = 0;
PrintSon(arr, brr, left + 1, right);
}
}
int main()
{
int arr[] = {1, 2, 3};
int brr[] = {0, 0, 0};
PrintSon(arr, brr, 0, 3);
return 0;
}

在这里插入图片描述