我正在尝试使用递归方法反转整数数组。到目前为止我对递归真的很糟糕,我想知道是否有人可以帮我解决这个问题。
到目前为止,这是我的代码:
public static int[] reverseArray(int[] array, int startIndex, int endIndex){
int[] tempArray = array;
if(tempArray[startIndex] == array[endIndex]){
return tempArray;
}
else{
tempArray[startIndex] = array[endIndex];
reverseArray(array, startIndex + 1, endIndex - 1);
return tempArray;
}
}
答案 0 :(得分:4)
您的递归逻辑很好:要反转数组,我们反转第一个和最后一个元素,并在没有这些元素的数组上再次执行该操作。这意味着我们需要将第一个和最后一个元素交换在一起并再次调用该方法,递增第一个索引并递减最后一个索引。但是,在您的代码中,您只需更改tempArray[startIndex]
而不是tempArray[endIndex]
。
基本条件是错误的:没有什么可做的,不是当第一个元素等于最后一个元素,而是当第一个索引大于或等于最后一个索引时(如果它等于,则只有要考虑的一个因素,所以反过来也是相同的元素。)
将此代码转换为代码:
private static int[] reverseArray(int[] array, int startIndex, int endIndex) {
if (startIndex >= endIndex) { // base condition, nothing to do when there is one or no element to consider
return array;
}
// swap array[startIndex] and array[endIndex]
int temp = array[startIndex];
array[startIndex] = array[endIndex];
array[endIndex] = temp;
// recurse with the decreasing bounds
return reverseArray(array, startIndex + 1, endIndex - 1);
}
请注意,我删除了tempArray
的声明:我们可以直接考虑array
。然后,我们可以添加一个实用工具方法:
public static int[] reverseArray(int[] array){
return reverseArray(array.clone(), 0, array.length - 1);
}
请注意,我将此方法设为public,另一个为private:您要调用的方法将是这一个,因为它隐藏了递归实现。我在那里添加了对clone()
的调用,以便在计算反向时不修改给定的数组。