首页 > 解决方案 > 打印数组中所有可能的元素组合

问题描述

在递归期间,一旦数组中的元素发生变化,这种变化就会持续存在。如何传递数组以便根据调用堆栈完成更改?一旦设置了索引 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

标签: crecursion

解决方案


如果您想保持数组完整,您需要恢复您在函数中对数组所做的任何更改。在这种情况下,您应该将更改之前的值存储在临时变量中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


推荐阅读