为什么这种搜索算法在这种情况下无法正常工作?

时间:2019-04-14 02:36:00

标签: java algorithm

我对Java有点陌生,我正在学习递归的概念。我正在创建一个递归算法,该方法通过使用compareTo方法检查Comparable数组中是否存在元素。尽管该算法在大多数情况下都有效,但是由于某种原因,它似乎在下半部分找不到元素。例如,如果数组是{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 && 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 个答案:

答案 0 :(得分:3)

copyOfRange的第三个参数是该元素不包含的copyTo索引-即copyTo索引处的元素未复制。所以你需要arr.length而不是arr.length-1

https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOfRange(boolean[],%20int,%20int)

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