递归反转数组函数问题排查:参数仅为数组与大小,输出异常
递归反转数组代码的修正方案
我尝试通过递归方式反转数组元素,函数仅允许使用数组和大小作为参数。目前已编写如下代码,但交换逻辑存在问题,输入数组[1,2,3]时输出结果为[2,3,1],请问该如何修正?
//递归反转数组函数 void reverse_arr(int a[],int size){ if(size ==0){ return ; } else{ int temp; int i= 0; temp = a[i]; a[i]= a[size-1]; a[size -1] = temp; reverse_arr(a, size-1); } }
先给你捋清楚问题出在哪:
你当前的递归逻辑是每次都交换数组第一个元素和当前长度对应的最后一个元素,然后把数组长度减1继续递归。拿输入[1,2,3]走一遍流程就明白为啥结果不对了:
- 第一次调用:交换
a[0]和a[2],数组变成[3,2,1],接着递归调用reverse_arr(a, 2) - 第二次调用:交换
a[0]和a[1],数组变成[2,3,1],接着递归调用reverse_arr(a, 1) - 第三次调用:交换
a[0]和a[0](等于没操作),递归到size=0后返回
最终结果自然就成了[2,3,1],完全不是我们想要的反转效果。
修正后的代码
正确的递归思路应该是:交换首尾元素后,递归处理中间去掉首尾的子数组,而不是继续从原数组开头处理缩短后的长度。因为函数参数只有数组和大小,我们可以通过指针偏移来指向子数组的起始位置,代码如下:
void reverse_arr(int a[], int size) { // 终止条件:数组长度<=1时,无需反转直接返回 if (size <= 1) { return; } // 交换当前数组段的首尾元素 int temp = a[0]; a[0] = a[size - 1]; a[size - 1] = temp; // 递归处理中间子数组:起始位置后移1位,长度减2(去掉首尾两个元素) reverse_arr(a + 1, size - 2); }
逻辑验证
再用[1,2,3]测试一次修正后的代码:
- 第一次调用:交换
a[0]和a[2],数组变为[3,2,1],接着递归调用reverse_arr(a+1, 1)(也就是处理[2]这个子数组) - 第二次调用:因为
size=1,直接触发终止条件返回
最终数组就是正确的[3,2,1]啦。
另外提个小优化:你原来的终止条件size==0可以改成size<=1,因为长度为1的数组反转前后没有变化,这样能少一次不必要的递归调用。
内容的提问来源于stack exchange,提问作者Angad
相关产品推荐
相关产品推荐

