使用递归在C中进行二进制搜索

时间:2015-02-04 16:24:18

标签: c recursion binary-search

程序在查找数组中没有的数字时崩溃。当我搜索数组中可用的元素时,代码工作正常。非常感谢。

#include<stdio.h>
int binarySearch(int a[],int s,int key)
{
    int middle;

    if(s!=1)
        middle=s/2;

    if(a[middle]==key)
        return 1;

    else if(key<a[middle])
        binarySearch(a,middle,key);

    else if(key>a[middle])
        binarySearch(&a[middle],middle,key);

    else
        return 0;
}

void main()
{
    int i;
    int a[]={1,2,3,4,6,9,10,11};

    for (i =0;i<8;i++)
        printf("%i ",a[i]);

    if(binarySearch(a,8,5))
        printf("\nFound");
    else
        printf("\nNot Found");
}

4 个答案:

答案 0 :(得分:1)

代码if(key<a[middle])binarySearch(a,middle,key);不会返回任何内容。

尝试if(key<a[middle]) return binarySearch(a,middle,key);

这可能仍然无法按照你的意愿行事,但至少你会超越主要的,立即可见的失控递归原因。

答案 1 :(得分:1)

更改

if(s!=1)
    middle=s/2;
if(a[middle]==key)
    return 1;
else if(key<a[middle])binarySearch(a,middle,key);
else if(key>a[middle])binarySearch(&a[middle],middle,key);

if (s != 1){
    middle = s / 2;
    if (a[middle] == key)
        return 1;
    else if (key<a[middle])binarySearch(a, middle, key);
    else if (key>a[middle])binarySearch(&a[middle], middle, key);
}

变量middle仅在s!=1

时初始化

我已运行此代码并获得输入Not Found的值5

如果您在发布模式下运行代码,请尝试在调试模式下构建代码并逐步运行,您将看到直接使用中间版时会发生什么,而不会为其指定特定值。这是有害的。

希望这有帮助。

答案 2 :(得分:0)

因为没有情况如果s == 1.“中间”没有被初始化并且[中间]可能会崩溃,或者它会变得无限。

答案 3 :(得分:0)

一些注意事项:

递归函数的每个分支都应该返回一些东西。您需要修改递归调用以返回调用

更改

binarySearch(a, middle, key) 

return binarySearch(a, middle, key)

另外,确保正确计算中间值。在s == 1的情况下,你没有正确地初始化它。你最希望从0开始。