Как мне найти последний элемент массива с помощью рекурсии?

#java #arrays #recursion

#java #массивы #рекурсия

Вопрос:

Все, что я хочу, это создать getLastElement(char[] array), который возвращает последний элемент массива с использованием рекурсии. Этот метод может получить доступ только к индексу 0, используя array[0] . Я могу использовать Arrays.copyOfrange. Я могу изменять только код внутри isSymmetric и код внутри getLastElement.

Я уже пробовал следующий метод для доступа к индексу 0, но у меня возникли проблемы с поиском последнего элемента массива.

Код:

 

    public static char getLastElement(char[] array) {
        if (array == null || array.length == 0)
            throw new NullPointerException();

        if(array.length == 1) {
            return array[0];
        } else {
            return getLastElement(Arrays.copyOfRange(array, 1, array.length));
        }
    }



    public static boolean isSymmetric(char[] array) {
        if (array == null)
            throw new NullPointerException("Null argument.");

        if(array.length <= 1) return true;


        if(getLastElement(array) == array[array.length -1])


            return isSymmetric(Arrays.copyOfRange(array, 1, array.length-1));

        return false;
    }
}

  

Я просто хочу, чтобы он возвращал последний элемент массива, и я хочу, чтобы он мог обращаться только к array[0] .

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

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

Ответ №1:

Проверьте это :

     public static char getLastElement(char[] array) {
        //CANNOT be modified
        if (array == null || array.length == 0)
            throw new NullPointerException();

        //This code can be modified
        if(array.length == 1) {
            return array[0];
        } else {
            return getLastElement(Arrays.copyOfRange(array, 1, array.length));
        }
    }
  

Если в массиве есть один элемент, мы просто возвращаем его. В противном случае мы передаем копию массива, начинающегося с индекса 1 предыдущего массива.

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

1. Это приводит к ошибкам. Я собираюсь добавить весь код и выходные данные, чтобы увидеть, что это такое.

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

3. Я отредактировал сообщение. Количество ошибок равно 4, в то время как оно должно быть 0. Я не понимаю, почему это неправильно :/

Ответ №2:

В 4-й строке isSymmetric функции есть ошибка. Изменить if(getLastElement(array) == array[array.length -1]) на if(getLastElement(array) == array[0])

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

1. Вы можете получить доступ только к индексу 0

Ответ №3:

 public static char getLastElement(char[] array) {
    //CANNOT be modified
    if (array == null || array.length == 0)
        throw new NullPointerException();

    //This code can be modified 
    try{
        return getLastElement(Arrays.copyOfRange(array,1,array.length));
    }catch (NullPointerException ex){
        return array[0];
    }

}
  

Это не будет работать для пустого массива — тогда будет выброшен нулевой указатель, но я думаю, это нормально. Я предположил, что вы не можете использовать длину массива для разных целей, а затем copyOfRange

Ответ №4:

Я не уверен, зачем вам нужно что-либо копировать. Просто увеличивайте индекс при каждой рекурсии

 public static char  getLastElement(char[] array) {  
   if(array == null) throw new RuntimeException("array should be initialized");  
   return getLastElement(array, 0);  
}

private static char getLastElement(char array, int index) {  
   if(index == array.size() - 1) {
      return array[index];
   }  
   return getLastElement(array, index   1);
}