繁体   English   中英

return in if 跳转到方法结束时返回

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM