#java #algorithm
#java #алгоритм
Вопрос:
Я несколько новичок в Java, и я изучал концепцию рекурсии. Я создавал рекурсивный алгоритм, который проверяет, существует ли элемент в сопоставимом массиве, используя метод compareTo . Хотя алгоритм работает в большинстве случаев, по какой-то причине он, похоже, не находит элемент во второй половине. Например, если массив {3, 5, 1, 9, 11}, вызов метода на 3, 5, 1 успешно возвращает true , но вызов метода на 9, 11 возвращает false . Прилагается код, любая помощь будет с благодарностью!
@SuppressWarnings ("unchecked")
public boolean searchItem (Comparable[] arr, Comparable searchValue)
{
if (arr.length == 1 amp;amp; arr[0].compareTo (searchValue) == 0)
return true;
else if (arr.length == 1)
return false;
return arr[0].compareTo (searchValue) == 0 || searchItem (Arrays.copyOfRange (arr, 1, arr.length - 1), searchValue);
}
Комментарии:
1. Во
Arrays.copyOfRange
втором параметре является эксклюзивным, что означает, напримерArrays.copyfOfRange(new Integer{ 1, 2 }, 1, 1).length == 0
. Вы удаляете последние два аргумента из массива. Использование операторов печати для распечатки массива должно продемонстрировать это.
Ответ №1:
3-й параметр copyOfRange
— это индекс CopyTo, исключающий элемент, т.Е. Элемент в индексе CopyTo не копируется. Итак, вам нужен arr.length там, а не arr.length — 1
from - the initial index of the range to be copied, **inclusive**
to - the final index of the range to be copied, **exclusive**.
(This index may lie outside the array.)
Итак, вам нужно searchItem (Arrays.copyOfRange (arr, 1, arr.length), searchValue)
Гораздо более простая рекурсивная программа — это
if(arr.length == 0)
return false;
if(arr[0].compareTo(searchValue) == 0)
return true;
return searchItem(Arrays.copyOfRange(arr, 1, arr.length), searchValue);
Комментарии:
1. @JohnA. Способ устранения неполадок — добавить следующие 2 оператора в начале функции поиска System.out.println(arr.length); System.out.println(Arrays.toString(arr)); Тогда вы бы сами поняли, что происходит не так