我尝试过回溯算法,当我在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
是一个全局变量,因此当执行else Try(k + 1);
时,j被重新初始化为零,并且在退出Try(k + 1);
之后,j
的值现在等于2,因此它将存在于for循环并结束您的代码。
但是在第二种情况下:j
是一个局部变量,所以当再次输入try
函数时,它将j
视为与旧j
不同的变量。它不是你想要访问的变量。
写递归函数时要小心。避免使用全局变量