如何不创建新数组且不使用索引,用递归反转整数数组?
问题分析与解决方案
核心问题拆解
- 递归状态丢失:你每次调用
Problem5都会把end重置为数组长度,导致递归过程中无法保留上一次的end值——这是因为你没有把beginning和end作为递归参数传递,而是用了成员变量或者方法内重复初始化的方式。 - 数组越界:数组索引从
0开始,myArray.length是元素总数,最后一个有效索引是myArray.length - 1。你初始把end设为myArray.length,直接访问myArray[end]必然触发ArrayIndexOutOfBoundsException。
修复后的代码
public int[] Problem5(int[] myArray) { // 提前处理空数组或无需交换的情况 if (myArray == null || myArray.length <= 1) { return myArray; } // 调用递归方法,初始化起始索引和末尾有效索引 return problem5Recursive(myArray, 0, myArray.length - 1); } // 私有递归方法,传递当前的边界参数 private int[] problem5Recursive(int[] myArray, int begin, int end) { // 终止条件:当左右边界相遇或交叉时,交换完成 if (begin >= end) { return myArray; } // 交换当前左右边界的元素 int temp = myArray[begin]; myArray[begin] = myArray[end]; myArray[end] = temp; // 递归缩小边界范围 return problem5Recursive(myArray, begin + 1, end - 1); }
关键修复点说明
- 用重载方法分离逻辑:公共方法负责处理参数校验和递归初始化,私有递归方法专注于每一步的交换和状态传递,彻底解决了
end被重复重置的问题。 - 修正索引边界:初始
end设为myArray.length - 1,确保访问的是有效数组索引;终止条件begin >= end保证交换到数组中间时自动停止,从根源避免越界。 - 增加边界判断:提前过滤空数组、长度为0或1的数组,避免无意义的递归调用。
内容的提问来源于stack exchange,提问作者poet_will
相关产品推荐
相关产品推荐

