【问题标题】:Different results when initializing a variable inside and outside for loop在 for 循环内部和外部初始化变量时的不同结果
【发布时间】: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 的值在递归调用后将不再相同。像这样到处使用全局变量是非常糟糕的做法。
  • 这里回溯了什么?你能再解释一下这个算法吗?

标签: c variable-initialization


【解决方案1】:

在第一种情况下: j 是一个全局变量,所以当执行 else Try(k + 1); 时,j 被重新初始化为零和之后并退出 Try(k + 1);j 的值现在等于 2,所以它将存在 for 循环并结束你的代码。

但在第二种情况下: j 是一个局部变量,因此当再次输入 try 函数时,它会将 j 视为与旧的 j 不同的变量。这与您尝试访问的变量不同。

编写递归函数时要小心。避免使用全局变量。

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 2012-05-11
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2020-09-25
    相关资源
    最近更新 更多