帮帮我。我是Java的新手,我陷入了二进制搜索递归(stackoverflow错误)的问题,在任何地方都找不到解决方案。
public class BinarySearch {
public static int binAry (int ary[], int st, int lt, int val){
if (st<=lt) {
int mid = (st + (lt-st)) / 2;
if (val > ary[mid]) {
binAry(ary, mid+1, lt, val);
}
else if (val < ary[mid]) {
binAry(ary, st, mid-1, val);
}
else{
return mid;
}
}
return -1;
}
public static void main (String[] args){
BinarySearch bs = new BinarySearch();
int [] numbers = {0,1,2,3,4,5};
int x = 3;
int pt = numbers.length;
int p = bs.binAry(numbers, 0, pt-1, x);
if (p == -1){
System.out.println("Number not found.");
}
else{
System.out.println("Number found at " + p);
}
}
}
答案 0 :(得分:1)
对于我所看到的,问题是(val> ary [mid])总是评估为true。总是。因此,您的代码将进入一个无限循环,最终将导致StackOverFlow异常。
如果您遵循代码中涉及的变量的值,您会注意到 val 永远不会改变,因为它从一开始就是它的值3。
另外, int mid =(st +(lt-st))/ 2 与 lt / 2 相同,因为st +(lt-st)= st-st + lt(通过为它们分配所需的任何值来进行测试)。因此,即使您在 binAry(ary,mid + 1,lt,val)中更改st的值,它实际上也没有任何作用。 lt 始终为 numbers.length-1 ,而 mid 始终为5/2 = 2。
在 int mid =(st +(lt-st))/ 2 下方添加此代码以检查自己:
System.out.println("st="+st);
System.out.println("lt="+lt);
System.out.println("mid="+mid);
也许,如果您解释了自己想做什么,我会对此有所了解,也许我将能够真正帮助您找到解决方案。
编辑:好的,在花了更多时间之后,我发现了您的错误。更改公式:
int mid = (st + (lt-st)) / 2 // This is wrong
int mid = st + (lt-st) / 2; // This is ok, notice the parentheses