作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用递归方法反转整数数组。到目前为止,我对递归真的很糟糕,我想知道是否有人可以帮助我解决我遇到的这个问题。
到目前为止,这是我的代码:
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;
}
}
最佳答案
您的递归逻辑很好:要反转数组,我们反转第一个和最后一个元素,然后在没有这些元素的数组上再次执行此操作。这意味着我们需要将第一个和最后一个元素交换在一起并再次调用该方法,增加第一个索引并减少最后一个索引。但是,在您的代码中,您只是更改了 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);
}
请注意,我将此方法设为公开,将另一个设为私有(private):您将要调用的是此方法,因为它隐藏了递归实现。我在其中添加了对 clone()
的调用,以便在计算反向时不修改给定的数组。
关于java - 如何在java中使用递归反转整数数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33335134/
我是一名优秀的程序员,十分优秀!