void show(int *arr, int n)
{
for (int i = 0; i<n; i++)
{
printf("%d", arr[i]);
}
}
void find(int *arr, int n, int i,int*brr,int b)
{
int j;
for ( j = i; j < n; )
{
brr[b] = arr[j];
find(arr, n, j+1,brr,b+1);
j++;
}
show(brr, b);
printf("\n");
}
int main()
{
int arr[4] = { 0,1,2,3 };
int brr[4];
find(arr, 4, 0,brr,0);
return 0;
}
用递归求解 这样说一开始我不会 就想如何遍历每一个数 比如我想打印一下 0,1,2,3 和0,1,2 我应该怎么样打印
那么不难写出
void find(int *arr, int n, int i)
{
int j;
for ( j = i; j < n; j++)
{
printf("%d", arr[j]);
find(arr, n, j+1);
}
printf("\n");
}
int main()
{
int arr[3] = { 0,1,2 };
find(arr, 3, 0);
return 0;
}
这样的代码但是这样毫无疑问是不对的因为每次遍历的时候 都会往后再加上了一个1
会导致有些打印重复而且少 这个是因为之前的遍历没有保存起来 需要保存起来然后再进行打印
第二种更加容易理解通过位数组
123 对应的位也就是 111---000
000也就代表什么都没有
100 可以代表 1
110 可以代表 12
111 可以代表 123
101可以代表13
011可以代表23
同理 这样这个代码很好写也很容易写了
void find(int *arr,int j)
{
int max = 1 << j;
for (int i = 0; i < max; i++)
{
int count = 0;
int f = i;
while (f!=0)
{
int j = f & 1;
if (j == 1)
{
printf("%d", arr[count]);
}
count++;
f = f >> 1;
}
printf("\n");
}
}
int main()
{
int arr[3] = { 0,1,2 };
find(arr, 3);
return 0;
}