控制可能会达到非空函数的结束...实现二进制搜索时出错

时间:2015-07-30 23:03:36

标签: 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;

    }
}

1 个答案:

答案 0 :(得分:1)

您的主要错误是您错过了对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(...)