打印数组中元素的所有可能组合

时间:2018-08-22 06:48:10

标签: c recursion

在递归过程中,一旦在数组中更改了元素,此更改将继续存在。如何传递数组,以便根据调用堆栈进行更改? 设置索引2的元素后,将在每个函数调用中对其进行设置。

代码如下:

#include<stdio.h>

void recur(int flag[], int n, int idx){
    if(idx==n){
        for(int i=0; i<n; i++)
            if(flag[i])
                printf("%d  ", i);
        printf("\n");
        return;
    }

    recur(flag, n, idx+1);
    flag[idx] = 1;
    recur(flag, n, idx+1);
}
int main(){
    int flag[] = {0, 0, 0};
    recur(flag, 3, 0);
    return 0;
}

它给了我以下输出:

2
1 2
1 2
0 1 2
0 1 2
0 1 2
0 1 2

1 个答案:

答案 0 :(得分:3)

如果要保持阵列完整,则需要将对函数所做的所有更改还原到阵列中。在这种情况下,您应该先将flag[idx]的值存储在临时变量中,然后再进行更改,然后将其还原:

#include <stdio.h>

void recur(int flag[], int n, int idx) {
  if (idx == n) {
    for (int i = 0; i < n; i++) {
      if (flag[i]) {
        printf("%d  ", i);
      }
    }
    printf("\n");
    return;
  }

  recur(flag, n, idx + 1);
  int temp = flag[idx];  // Change line 1
  flag[idx] = 1;
  recur(flag, n, idx + 1);
  flag[idx] = temp;  // Change line 2
}

int main() {
  int flag[] = {0, 0, 0};
  recur(flag, 3, 0);
  return 0;
}

在ideone中查看:https://ideone.com/Q6Vb7A