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

标签 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);
  }

最佳答案

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

关于java - 为什么这种搜索算法奇怪地不适用于这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55671513/

相关文章:

java - 如何使用 apache commons 从 TAR 解压缩特定文件?

Java线程与其他程序通信

algorithm - Haskell 中的快速 Pollard Rho 分解

algorithm - 高炉? - 找到从 s 到 t 的所有路径,其长度至多为一定长度

algorithm - 如何通过反转子序列对排列进行排序(取自 Skiena 第 3 版)

java - JMS 2.0-MQ 9-主题共享订阅不起作用

java - 使用 Maven 命令行将 Java/动态 Web 项目转换为 Maven 项目

java - 从 Java 程序向标准输出添加日期戳

c++ - 在不止一个回文的情况下寻找最长但字典序最小的回文

algorithm - 有效地生成没有重复子集的组合