java - 如何在没有 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 循环?
解决方案
基本策略是在循环中添加额外的条件,并在循环内的代码中设置和使用这些条件。
例如,对于上述循环:
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。
推荐阅读
- c# - 我如何为 c# 方法实现父级
- java - 如何缩短此代码并减少重复性?
- ruby-on-rails - Update to array in ActiveRecord column not saving
- javascript - Why don't all web workers send back data with a postMessage?
- javascript - Pagination without a table
- spring - Implementing and testing Facebook comment Plugins locally
- python - 如何在forms.py(不在模板中)Django中获取字段类型
- java - How to register a servlet in Spring Boot XML file?
- c++ - 从类成员返回智能指针的正确方法?
- python - 私有化头像 discord.py