![](/img/trans.png)
[英]Method does not end when it encounters “return” and it jumps to another place in that method
[英]return in if jumps to return on the end of the method
我想创建一个 binarySearch 算法作为递归。 代码应该没问题,因为一切都按我的意愿工作。
这是我的代码:
public class Searcher {
public static <T extends Comparable<T>> int binarySearchRecursive(T[] values, T key) {
int start = 0;
int end = values.length - 1;
int mid = (start + end) / 2;
return binarySearchRecursive(values, key, start, end, mid);
}
public static <T extends Comparable<T>> int binarySearchRecursive(T[] values, T key, int start, int end, int mid) {
if (key.compareTo(values[mid]) == 0) {
return mid;
} else if (key.compareTo(values[mid]) < 0) {
end = mid;
mid = (start + end) / 2;
binarySearchRecursive(values, key, start, end, mid);
} else if (key.compareTo(values[mid]) > 0) {
start = mid;
mid = (start + end) / 2;
binarySearchRecursive(values, key, start, end, mid);
}
return -1;
}
}
对它的测试如下:
class SearcherTest {
private Integer[] values;
@BeforeEach
void setUp() {
values = new Integer[]{1, 3, 5, 7, 9, 11};
}
@Test
void binarySearchRecursive() {
for (int i = 0; i < values.length; i++) {
assertEquals(i, Searcher.binarySearchRecursive(values, values[i]),
"binary search should return index for included values");
}
assertEquals(-1, Searcher.binarySearchRecursive(values, 100),
"binary search should return -1 for not included values");
}
}
在调试时,一切都按预期工作。 虽然在跳入 if 之后
if (key.compareTo(values[mid]) == 0) {
return mid;
被执行,但立即跳转到最后的 return -1 并且不返回想要的 mid int。
我怎样才能解决它并给中间而不是-1?
谢谢你的帮助!
似乎您有一个相当简单的错误,您只是忘记从递归中返回值。
只需在调用binarySearchRecursive(values, key, start, end, mid);
之前添加一个返回语句应该修复它。
所以你的代码看起来像这样:
public class Searcher {
public static <T extends Comparable<T>> int binarySearchRecursive(T[] values, T key) {
int start = 0;
int end = values.length - 1;
int mid = (start + end) / 2;
return binarySearchRecursive(values, key, start, end, mid);
}
public static <T extends Comparable<T>> int binarySearchRecursive(T[] values, T key, int start, int end, int mid) {
if (key.compareTo(values[mid]) == 0) {
return mid;
} else if (key.compareTo(values[mid]) < 0) {
end = mid;
mid = (start + end) / 2;
return binarySearchRecursive(values, key, start, end, mid);
} else if (key.compareTo(values[mid]) > 0) {
start = mid;
mid = (start + end) / 2;
return binarySearchRecursive(values, key, start, end, mid);
}
return -1;
}
}
希望这可以帮助! 快乐编码!
编辑:为了消除一些误解,在调试器中,它不会在返回时跳出if
语句。 它离开方法并进入它之前离开的方法。 最好用一个例子来解释这一点。
如果我们有一棵这样的树:
3
/ \
1 5
/ \ / \
0 2 4 6
并且想要找到值 2,我们从顶部(中间)开始,我们看到 2 != 3 所以我们向左走。 我们需要明确地告诉计算机返回我们的 anwser,即使它当前没有找到,因为我们只有在执行了一些递归步骤后才能找到它。 当我们在左分支时,我们看到 2 != 1 并向右走。 再次,我们需要明确地告诉计算机返回它在树的那个分支中找到的答案,因为我们还没有到达那里。 现在当我们到达 2 == 2 时,anwser 被接受,但返回它我们只能在递归中返回一层。 如前所述,我们需要通过不断返回来传播我们得到的结果。
如果这仍然有点混乱,您可能需要了解一下递归的工作原理(主要是使用的堆栈)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.