递归Bool函数"跳过"返回

时间:2017-07-23 20:38:48

标签: c recursion

我用C编码打破了生锈,并且一直在进行分类和搜索练习;特别是,使用递归进行二进制搜索。我得到了意想不到的结果,因为当我的二元搜索功能找到它正在寻找的值时,它应该"应该"返回true,但跳过最后的可能"返回false"指令。在下面,我分享了代码,以及打印输出,以演示如何识别排序数组中的特定值,但仍然导致错误的'被退回。

所有这一切都有一个例外......如果搜索到的值恰好是整个原始数组的中间元素中包含的中点值,那么它是在第一次执行binSearch函数时找到的,它按预期返回true。只有在进行后续递归调用时,成功的查找仍会导致对调用二进制搜索函数的函数返回false。

代码如下;传递的数组已经从最小到最大排序:

bool binSearch(int value, int values[], int up, int down)
{
    int midElement = (up-down)/2 + down;
    int midValue = values[midElement];
    printf("Midvalue now equals: %i\n", midValue);

    if(up >= down)
    {
        if(value == midValue)
        {    
            printf("Found '%i' at element '%i': ", midValue, midElement);
            return true; //This gets skipped, even when printf shows the find
        }
        else if(value > midValue)
            binSearch(value, values, up, midElement+1);
        else if(value < midValue)
            binSearch(value, values, midElement-1, down);
    }
    return false;
}

样品输出 - 注意&#34;未找到值&#34;如果它接收到错误,则调用binSearch的函数将打印出来。

Current Value: 1222
Current Value: 9601
Current Value: 46592
Current Value: 64187
Current Value: 64657
Midvalue now equals: 46592
Midvalue now equals: 1222
Midvalue now equals: 9601
Found '9601' at element '1'
Didn't find the value.

当搜索的值位于整个数组的中间时的示例输出 - 这是一个异常,其中按预期返回true。

Current Value: 1222
Current Value: 9601
Current Value: 46592
Current Value: 64187
Current Value: 64657
Midvalue now equals: 46592
Found '46592' at element '2':
Found the value.

我理论上认为第二代递归函数调用的结果如何传递给原始调用者(或者更确切地说,根本没有传回)的问题一定存在问题......

感谢您对此处可能发生的事情的任何见解。

1 个答案:

答案 0 :(得分:0)

您的函数binSearch为每个调用返回一个布尔值。确保在递归崩溃时返回布尔值。即。

else if(value > midValue)
    return binSearch(value, values, up, midElement+1);
else if(value < midValue)
    return binSearch(value, values, midElement-1, down);