【问题标题】:Binary Search Using Recusion使用递归的二分搜索
【发布时间】:2019-03-21 04:51:04
【问题描述】:

我正在尝试使用 Java 中的递归创建二进制搜索算法,在调试时一切似乎都很好,直到它找到值并应该返回所需键的索引。但是,由于某种原因,它会跳过 return 语句并转到底部的 return 语句。

public int binSearch(int key, int L, int R) {

    int mid =(R + L)/2;

    if (R < L) {
        return -1;
    }

    if (A[mid] == key) {
        return mid;
    }

    if (key > A[mid]) {
        binSearch(key, mid + 1, R);
    }

    if (key < A[mid]) {
        binSearch(key, L, mid - 1);
    }
   return -1;
}

【问题讨论】:

  • 想一想当您对binSearch(key, L, mid - 1); 的调用从递归返回时会发生什么。而不是使用该函数调用返回的内容,而是在底部返回-1。因此,您可能应该为每次通话说return binSearch(...)。此外,您的 if 语句已经检查了将 keyA[mid] 进行比较的所有情况。检查这些比较时,您可能会受益于使用if elseelse 条件。
  • 您缺少退货声明。试试这种方式return binSearch()

标签: java search binary


【解决方案1】:

我能够从old post 中挽救这个问题。我知道它不能解决您的问题,但它向您展示了解决此问题的另一种方法。

public static int binarySearch(int[] a, int target) {
    return binarySearch(a, 0, a.length-1, target);
}

public static int binarySearch(int[] a, int start, int end, int target) {
    int middle = (start + end) / 2;
    if(end < start) {
        return -1;
    } 

    if(target==a[middle]) {
        return middle;
    } else if(target<a[middle]) {
        return binarySearch(a, start, middle - 1, target);
    } else {
        return binarySearch(a, middle + 1, end, target);
    }
}

【讨论】:

    【解决方案2】:

    您缺少一些返回语句(当您递归调用 binSearch 时)

    public int binSearch(int key, int L, int R) {
        int mid =(R + L)/2;
        if (R < L) {
            return -1;
        }
        if (A[mid] == key) {
            return mid;
        }
        if (key > A[mid]) {
            return binSearch(key, mid + 1, R);
        }
        if (key < A[mid]) {
            return binSearch(key, L, mid - 1);
        }
        return -1;
    }
    

    【讨论】:

    • 你最后的return语句永远不会执行。那么有这样的声明有什么意义呢?
    • 避免将代码重构为 if else 以使其编译
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2013-11-28
    • 2018-06-24
    相关资源
    最近更新 更多