如何在不使用break语句的情况下键入BinarySearch方法while循环?

时间:2019-06-21 17:17:59

标签: java while-loop break infinite

我刚刚学习了简单的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循环?

1 个答案:

答案 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