在实现之前,我有一些代码要做一些测试。基本上在第二次递归调用时它应该在这一行输入(否则如果(sec> = 1){return test(s,lowerBounds + middle + 1,upperBounds);})但它不会改为继续其他如果和更改秒的值。我错过了什么吗?
public class Main
{
private static String[] test = { "aaa", "aab", "aac", "aad", "aae" };
public static void main( String[] args ) {
System.out.println( test( "aab", 0, 4 ) );
}
public static int test( String s, int lowerBounds, int upperBounds ) {
if( upperBounds < lowerBounds || upperBounds > lowerBounds ) {
int middle = ( upperBounds – lowerBounds ) / 2;
int sec = s.compareTo(test[lowerBounds + middle]);
if( sec == 0 )
{ return lowerBounds + middle; }
else if( sec <= -1 )
{ return test( s, lowerBounds, upperBounds – middle – 1 ); }
else if( sec >= 1 )
{ return test( s ,lowerBounds + middle + 1, upperBounds ); }
} else { return -1; }
return -10;
}
}
编辑:对不起,我应该说这是我自己实现的二进制搜索。我仍在学习自己的编程,所以如果我以某种方式搞砸了,请不要激怒我。
编辑:如果我删除第一个if语句,它看起来好像没问题?
答案 0 :(得分:4)
这一行
if( upperBounds < lowerBounds || upperBounds > lowerBounds )
看起来很可疑。如果您的upperBounds低于lowerBounds,那么middle将为负数。通常,这应该仅在递归结束时发生(当您找到正确的元素时,或者当它不存在时)。如果删除这个if语句,这可能就是你的递归有效的原因(但是如果你严重调用函数,事情就会中断)。
另外,为什么要与test [lowerBounds + middle]进行比较?
int sec = s.compareTo(test[lowerBounds + middle]);
二进制排序的想法是计算边界的中间位置(如果有意义),并将中间的元素与您正在寻找的元素进行比较。
如果中间较大,(假设您的数组已排序),则必须查看“左侧”。如果if更低,则看起来“在右侧”。您的测试仅在第一次递归时起作用,因为lowerBounds为0。
希望这有帮助。
答案 1 :(得分:3)
if(upperBounds&lt; lowerBounds || upperBounds&gt; lowerBounds)
除了upperBounds == lowerBounds
。的情况外,对于每个数字都是正确的