在递归过程中,一旦在数组中更改了元素,此更改将继续存在。如何传递数组,以便根据调用堆栈进行更改? 设置索引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
答案 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