我刚刚学习了简单的BinarySearch算法,但令我感到困扰的一件事是,我被告知在Java中break(和continue)语句通常是多余的,并且您可以使用大多数while循环而无需使用它们。但是我不知道如何从下面的BinarySearch while循环中摆脱下摆:-
public static void BinarySearch(int[] list, int key){
int lo = 0;
int hi = list.length-1;
int mid = 0;
while(lo<=hi){
mid = lo + (hi-lo) / 2;
if(key<list[mid])
hi = mid-1;
else if(key>list[mid])
lo = mid+1;
else {
System.out.println("Key is found at index = " + mid);
break;
}
if(lo>hi){
System.out.println("Key doesn't exist in the list");
}
}
问题1:如果不包含break语句,为什么循环不断进行?变量“ lo”最终不应该大于“ hi”吗?最后一个if-conditions怎么能看到,而while-loop-conditional怎么看?
问题2:如何在无需break语句的情况下键入while循环?
答案 0 :(得分:2)
基本策略是在循环中添加额外的条件,并在循环内的代码中设置和使用这些条件。
例如,对于上述循环:
int keyIndex = -1;
. . .
while ( (lo<=hi) && (keyIndex == -1) ) {
. . .
else {
System.out.println("Key is found at index = " + mid);
keyIndex = mid; // <<<
}
. . .
}
但是,对于许多这样的循环,使用break语句进行这种循环被许多开发人员视为可接受的编程习惯。
这里是reddit discussion on the use of break and continue。
这是question in the sister site on software engineering。
关于为什么没有break语句就不会退出循环的原因是,如果找到键,则 lo 的值不会更改。因此, lo 的值不一定会大于 high 。