You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组反转程序运行异常 未完成全部元素反转问题排查

问题根因

你代码的核心问题是同时混用了迭代(while循环)和递归逻辑,且C语言中函数形参为值传递,递归内部修改的start、end不会影响上层函数的局部变量,具体执行流程如下:

  1. 首次调用reverseArray(ar, 0, 4),进入while循环,0<4成立,交换下标0和4的元素,数组变为[5,2,3,4,1],局部变量start变为1、end变为3,随后调用reverseArray(ar, 1, 3)
  2. 进入第二层递归调用,1<3成立,交换下标1和3的元素,数组变为[5,4,3,2,1],当前层局部变量start变为2、end变为2,调用reverseArray(ar, 2, 2)
  3. 第三层调用中2<2不成立,直接返回到第二层,第二层while判断2<2不成立,返回到第一层调用
  4. 第一层的局部变量start、end仍然是1和3(值传递不会被递归修改),再次触发while判断1<3成立,第二次交换下标1和3的元素,数组变回[5,2,3,4,1],start变为2、end变为2,再次调用递归后返回,while循环结束
    整个流程中while循环共执行3次,和你观察到的现象一致,最终数组被错误地二次交换回异常状态。
修复方案

只需要保留递归或迭代其中一种逻辑即可,两种实现方式如下:

方案1:纯递归实现(去掉while循环,改为if单次判断)

void reverseArray(int ar[], int start, int end)
{
    if (start < end)
    {   
        ar[start] = ar[start] + ar[end];
        ar[end] = ar[start] - ar[end];
        ar[start] = ar[start] - ar[end];
        reverseArray(ar, start + 1, end - 1);
    }
}

方案2:纯迭代实现(去掉递归调用)

void reverseArray(int ar[], int start, int end)
{
    while (start < end)
    {   
        ar[start] = ar[start] + ar[end];
        ar[end] = ar[start] - ar[end];
        ar[start] = ar[start] - ar[end];
        start += 1;
        end -= 1;
    }
}

补充说明:你当前使用的加减法交换变量的方式存在整数溢出风险,生产环境建议使用临时变量交换,兼容性更高。

内容的提问来源于stack exchange,提问作者Tosif Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:30:03