Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这种搜索算法奇怪地不适用于这种情况?_Java_Algorithm - Fatal编程技术网

Java 为什么这种搜索算法奇怪地不适用于这种情况?

Java 为什么这种搜索算法奇怪地不适用于这种情况?,java,algorithm,Java,Algorithm,我对Java有点陌生,我正在学习递归的概念。我正在创建一个递归算法,通过使用compareTo方法检查可比较数组中是否存在元素。尽管该算法在大多数情况下都有效,但出于某种原因,它似乎无法在下半部分找到元素。例如,如果数组为{3,5,1,9,11},则在3,5,1上调用方法将成功返回true,但在9,11上调用方法将返回false。附件是代码,任何帮助都将不胜感激 @SuppressWarnings ("unchecked") public boolean searchItem (Comp

我对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 && 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);
  }

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

所以您需要
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);    

Arrays.copyOfRange
中,第二个参数是独占的,这意味着,例如
Arrays.copyfOfRange(新整数{1,2},1,1)。长度==0
。您正在从数组中删除最后两个参数。使用print语句打印出数组应该可以证明这一点。@JohnA。解决此问题的方法是在搜索函数System.out.println(arr.length)的开头添加以下2条语句;System.out.println(Arrays.toString(arr));然后你就会发现自己出了什么问题
if(arr.length == 0)
    return false;

if(arr[0].compareTo(searchValue) == 0)
    return true;

return searchItem(Arrays.copyOfRange(arr, 1, arr.length), searchValue);