轻功水上漂zz 2024-09-25 21:05 采纳率: 59.4%
浏览 3

c语言关于递归回溯小问题

全局变量i,递归过程加一,为什么会在回溯的时候回到原来的值,又变成0了?
我后面需要打印,所以得保存一下字符数组到第几个被赋值了。

char s[100];
int i = 0,count=0;
void func(int n, char s[], int i)       //把数字n变成数字字符保存到字符数组s里
{
    s[i] = n % 10+'0';                    // n的最后一位,先赋值再往下处理
    if (n / 10 == 0)return;                 // 最后到个位赋值完了就结束往下递归,开始回溯
    func(n / 10, s, i=i+1);               //往下递归
//    count++;

int main()
{
    int n;
    scanf("%d", &n);
    func(n, s, i);
    for (count;count >= 0;count--)          //这个本来用的是i,结果发现i不行,换的count就可以了。
        printf("%c", s[count]);
    return 0;
}

}

img

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-25 21:06
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    关于您的问题,首先需要指出,递归函数中使用全局变量来跟踪状态是一个潜在的风险点,可能会导致意外的行为。在这个例子中,全局变量 i 在递归调用中被修改,但每次递归调用都会创建新的局部变量 i 实例,这些实例不会改变全局变量的值。当递归调用返回时,它们不会将全局变量 i 的值回溯到之前的状态。因此,您看到全局变量 i 在递归结束后回到初始值(即 0)。这就是为什么在您的代码中直接使用 i 在回溯时不能达到预期的效果。要解决这个问题,您需要找到一种不同的方法来跟踪状态。在这种情况下,使用额外的变量(如 count)来跟踪状态是一个可行的解决方案。然而,更好的做法可能是避免使用全局变量并传递状态信息作为参数或使用其他方法来跟踪状态。以下是针对您的代码的一些修改建议:函数内部的参数用来记录当前的数字位数位置更为妥当,函数间互相独立而非共享变量修改其状态值:代码如下:c char s[100]; void func(int n, char s[], int *i) // 将 i 作为指针传递,用以改变全局变量的值 { s[*i] = n % 10+'0'; // 将数字 n 的最后一位转换为字符并存入数组 s if (n == 0) return; // 当 n 为 0 时停止递归 func(n / 10, s, i); // 进行递归调用时,将 i 值加一 (*i)++; } int main() { int n; scanf("%d", &n); int i = 0; // 将 i 作为局部变量初始化 func(n, s, &i); // 将 i 作为指针传递给函数 for (int j = 0; j <= i; j++) // 使用 i 来控制循环次数 printf("%c", s[j]); return 0; } 在这个修改后的代码中,我们使用指针来传递 i 的地址给递归函数 func,从而在递归过程中修改全局变量 i 的值。然后我们可以使用这个变量来控制打印循环的次数。这样就能解决回溯时状态丢失的问题。请注意,使用指针时需要谨慎处理内存访问问题以避免潜在错误。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月25日