Java: используйте рекурсию, чтобы проверить, упорядочен ли массив

#java #recursion

#java #рекурсия

Вопрос:

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

 public class ArrayOrdered {

    public static boolean isArrayInSortedOrder(int[] array, int index)
    {
        boolean b;
        int a1;
        int a2;

        if(array.length == 1 || index == 1){//base case
            b=true;
        }else{
            b=false;
            a1 = array[index - 1];
            a2 = array[index - 2];
            if((a1 > a2)){//ordered
                isArrayInSortedOrder(array, index - 1);
            }   
        }

        return b; 
    }

    public static void main(String[] args) {
        int index=20;
        int[] array={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
        boolean bool = isArrayInSortedOrder(array, index);
        if(bool)
            System.out.println("Array ordered");
        if(!bool)
            System.out.println("Array NO ordered");
    }

}
  

Комментарии:

1. измените рекурсивный, добавьте возврат return isArrayInSortedOrder(array, index - 1);

Ответ №1:

Вы вызываете isArrayInSortedOrder(array, index - 1) , но игнорируете возвращаемое значение. Рассмотрим следующее:

 public static boolean isArrayInSortedOrder (int[] array, int index) {
    if (array.length == 1 || index == 1) { //base case
        return true;
    }

    int a1 = array[index - 1];
    int a2 = array[index - 2];
    if (a1 > a2) {
        return isArrayInSortedOrder(array, index - 1);
    }   

    return false;
}
  

Комментарии:

1. Это только проверяет, находится ли массив в порядке возрастания.

Ответ №2:

Я бы постарался избегать временных значений, если они затрудняют чтение кода. Вам также необходимо вернуть значение, которое вы повторяете (или это не будет работать так, как вы хотите). Что-то вроде

 public static boolean isArrayInSortedOrder(int[] array, int index) {
    if (array == null || array.length < 2 || index < 2) {
        return true;
    }
    if (array[index - 1] > array[index - 2]) {
        return isArrayInSortedOrder(array, index - 1);
    }
    return false;
}
  

И когда вы его вызываете, я бы предпочел использовать array.length (вместо жесткого кодирования index ).

 boolean bool = isArrayInSortedOrder(array, array.length);
  

Комментарии:

1. Да, я использовал временные значения только для отладки кода