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