2015-10-25 2 views
2

Я пытаюсь обратить массив целых чисел, используя рекурсивный метод. До сих пор я очень плохо разбираюсь в рекурсии, и мне было интересно, может ли кто-нибудь помочь мне с этой проблемой, с которой я столкнулся.Как отменить целочисленный массив с помощью рекурсии в java?

Вот мой код до сих пор:

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

У вас есть правильный рекурсивный вызов - просто подумайте о том, что вам нужно сделать для 'array [startIndex]' и 'array [endIndex]', чтобы полностью изменить массив. Кроме того, подумайте о состоянии остановки - почему значение равенства значений элементов имеет значение? –

+0

BTW, 'tempArray' - просто псевдоним для' array' - вы не делаете копию массива, делая это. Это только помогает сделать код более сложным. –

ответ

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); 
} 

Обратите внимание, что я сделал этот метод общественности, а другой частный: тот, который вы будете хотеть назвать это будет один, так как она скрывает рекурсивную реализацию. Я добавил вызов clone(), чтобы не изменять данный массив при вычислении обратного.

Смежные вопросы