Ваша рекурсивный логика прекрасно: отменить массив, мы поменяем первый и последний элемент и сделать это снова на массиве без этих элементов. Это означает, что нам нужно поменять первый и последний элементы вместе и снова вызвать метод, увеличив первый индекс и уменьшив последний индекс. В вашем коде, однако, вы меняете только 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);
}
Обратите внимание, что я сделал этот метод общественности, а другой частный: тот, который вы будете хотеть назвать это будет один, так как она скрывает рекурсивную реализацию. Я добавил вызов clone()
, чтобы не изменять данный массив при вычислении обратного.
У вас есть правильный рекурсивный вызов - просто подумайте о том, что вам нужно сделать для 'array [startIndex]' и 'array [endIndex]', чтобы полностью изменить массив. Кроме того, подумайте о состоянии остановки - почему значение равенства значений элементов имеет значение? –
BTW, 'tempArray' - просто псевдоним для' array' - вы не делаете копию массива, делая это. Это только помогает сделать код более сложным. –