Почему этот алгоритм поиска странным образом не работает для этого случая?

#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

https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOfRange (логическое значение[], int, int)

 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)); Тогда вы бы сами поняли, что происходит не так