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