我的任务是使用递归在Java中创建二进制搜索。但是,即使我指定了返回值,它仍然告诉我必须返回一个int结果。这是我的代码的相关部分:
我试图在if-else语句之外添加一个返回值,只是为了接收StackOverflowError。
result = binarySearch(numbers, 0, numbers.length-1, search);
if(result==-1)
System.out.println("Value not found.");
else
System.out.println(search + " was found at index " + result);
}
public static int binarySearch(int n[], int f, int l, int val) {
if(f>l)
return -1;
else {
int mid = (f+l)/2;
if(val == mid)
return n[mid];
else {
if(val < mid)
binarySearch(n, f, mid-1, val);
if(val > mid)
binarySearch(n, f, mid+1, val);
}
}
}
我期望如下:从用户收集值 search 并将其传递给binarySearch方法。然后,binarySearch方法应从0的起始值到最终的值搜索我的int数组 numbers ,以找到该值。我相信在binarySearch方法中,我的逻辑是正确的。当初始下限值大于初始上限值时,表示搜索已完成且未找到结果,因此返回-1。否则,该项位于数组中,因此请创建一个值 mid 来设置搜索的中间值。如果要搜索的值等于中值,则返回找到它的索引。如果该值小于中间值,则减小较高的值并再次运行搜索,因为该数字必须在中间值的左侧。如果该值大于中间值,则将其增加并重新运行,因为它必须在右边。我对我的理解正确吗?为什么不能在if-else语句中识别出返回值?
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
逻辑是正确的,您只需要在递归完成后返回,并用if / else替换比较val
和mid
的两个即可。修改后的递归函数将如下所示:
public static int binarySearch(int n[], int f, int l, int val) {
if(f>l){
return -1;
} else {
int mid = (f+l)/2;
if(val == mid) {
return n[mid];
} else {
if(val < mid) {
return binarySearch(n, f, mid-1, val);
} else {
return binarySearch(n, mid+1, l, val);
}
}
}
}
答案 1 :(得分:0)
将val与n [mid](而不是mid)进行比较。