一、题目描述
通过使用分治策略,打印一个数组元素的所有子集
输入: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); }
|
上述程序的递归活动如下
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
我们在递推的过程中将brr[i] = 1; 回归的过程中将brr[i] = 0; 最终通过brr[i] == 1 ? 打印 : 不打印;
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
三、代码实现
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; }
|
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)