控件可能到达非空函数的末尾...实现二分查找时出错

标签 c binary-search

我正在尝试对数组进行二分查找。我试图摆脱编译时遇到的这个错误,但做不到。这是我为二进制搜索所做的功能:

bool BinSearch(int key, int Array[], int min, int max)
{
    if (max < min)
    return false;

    else
    {

        int mid = (min + max)/2 ;

        if (key > Array[mid])
            BinSearch(key, Array, mid+1, max);

        else if (key < Array[mid])
            BinSearch(key, Array, min, mid-1);

        else
            return true;

    }
}

最佳答案

您的主要错误是您缺少递归调用 BinSearch 的返回语句.为了使这个解释更容易理解,我在您的代码中添加了一些括号,以使所有内容更加明确。请注意,下面的代码与您的代码相同,只是带有一些(冗余的)括号和更合适的缩进。

现在假设我们有一个代码路径,其中 max < minfalse其次是 key > Array[mid]正在true .因此我们有以下程序执行,在代码中注释:

bool BinSearch(int key, int Array[], int min, int max)
{
    if (max < min) { // Step 1, false
        return false;
    }
    else {
        // Step 2, start the else block
        int mid = (min + max)/2 ;

        if (key > Array[mid]) { // Step 3, true
            BinSearch(key, Array, mid+1, max); // Step 4 call BinSearch
            // Step 5, finished with call to BinSearch
        }
        else if (key < Array[mid]) {
            BinSearch(key, Array, min, mid-1);
        }
        else {
            return true;
        }
        // Step 6, Done with else block
    }
// Step 7, Done with function, no return statement
}

如果 key > Array[mid] 也会发生类似的事情是falsekey < Array[mid]true .这应该清楚说明为什么您的编译器正确地认为存在没有返回的代码路径。正如之前在评论中指出的那样,解决方案是做 return BinSearch(...) .

关于控件可能到达非空函数的末尾...实现二分查找时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31735517/

相关文章:

C:在没有 main() 的情况下编译某些对象(用于共享库)失败?

c - 初始化结构数组

c - 用于异步线程的 pthread_join()

c# - 在 .NET/C# 上下文中,什么是二分搜索以及如何/为什么使用二分搜索?

java - Java 中的二进制搜索 - 学习它 "my way"

c - Xcode中的引用传递,C语言

c - menu.h && form.h 在 pdcurses 中不存在

arrays - 使用二进制搜索查找最大子数组

java - 根据要求具有多个键值的 Arrays.binarySearch

C++ 二进制搜索函数不打印