首页 > 解决方案 > 如何在没有 break 语句的情况下键入 BinarySearch 方法 while-loop?

问题描述

我刚刚完成了简单的 BinarySearch 算法的学习,但让我感到困扰的一件事是,我被告知 break(和 continue)语句在 Java 中通常是多余的,并且您可以在没有它们的情况下使用大多数 while 循环。但我不知道如何从下面的 BinarySearch while-loop 中摆脱下摆:-

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-conditional 可以看到,而 while-loop-conditional 却看不到?

问题 2:如何在不需要 break 语句的情况下键入 while 循环?

标签: javawhile-loopbreakinfinite

解决方案


基本策略是在循环中添加额外的条件,并在循环内的代码中设置和使用这些条件。

例如,对于上述循环:

int keyIndex = -1;

. . .

while ( (lo<=hi) && (keyIndex == -1) ) {
    . . .
    else {
        System.out.println("Key is found at index = " + mid);
        keyIndex = mid;     // <<< 
    }
    . . .
}

然而,对这样的循环使用 break 语句被许多开发人员认为是可接受的编程实践。

这是关于使用 break 和 continue 的 reddit 讨论

这是关于软件工程的姐妹网站上的一个问题

至于为什么没有break语句你的循环不会退出是如果找到键,lo的值不会改变。所以不,lo的值不一定会大于high


推荐阅读