C语言数组反转程序运行异常 未完成全部元素反转问题排查
问题根因
你代码的核心问题是同时混用了迭代(while循环)和递归逻辑,且C语言中函数形参为值传递,递归内部修改的start、end不会影响上层函数的局部变量,具体执行流程如下:
- 首次调用
reverseArray(ar, 0, 4),进入while循环,0<4成立,交换下标0和4的元素,数组变为[5,2,3,4,1],局部变量start变为1、end变为3,随后调用reverseArray(ar, 1, 3) - 进入第二层递归调用,
1<3成立,交换下标1和3的元素,数组变为[5,4,3,2,1],当前层局部变量start变为2、end变为2,调用reverseArray(ar, 2, 2) - 第三层调用中
2<2不成立,直接返回到第二层,第二层while判断2<2不成立,返回到第一层调用 - 第一层的局部变量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
相关产品推荐
相关产品推荐

