【发布时间】:2021-10-28 23:13:50
【问题描述】:
我尝试过回溯算法,在 for 循环内外初始化变量时收到不同的结果,但我不明白为什么。
#include <stdio.h>
int a[10];
int n;
int i;
int j; //difference
void display(){
for (i = 1; i <= n; i++) printf("%d", a[i]);
printf("%\n");
}
void Try(int k){
for (j = 0; j <= 1; j++){ //difference
a[k] = j;
if (k == n) display();
else Try(k + 1);
}
}
int main(){
n = 2;
Try(1);
}
和
#include <stdio.h>
int a[10];
int n;
int i;
//int j; //difference
void display(){
for (i = 1; i <= n; i++) printf("%d", a[i]);
printf("%\n");
}
void Try(int k){
for (int j = 0; j <= 1; j++){ //difference
a[k] = j;
if (k == n) display();
else Try(k + 1);
}
}
int main(){
n = 2;
Try(1);
}
第一个代码的结果就是 00, 01 但第二个代码的结果是 00, 01, 10, 11(预期结果)。
为什么会有这种差异?
【问题讨论】:
-
在第一种情况下,所有递归调用共享相同的
j值。这意味着调用者中j的值在递归调用后将不再相同。像这样到处使用全局变量是非常糟糕的做法。 -
这里回溯了什么?你能再解释一下这个算法吗?