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

Binary Search in C using recursion

当我搜索 array.Help 中可用的元素时,程序在查找 array.The 代码中不可用的数字时崩溃非常感谢。

#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");
}

代码 if(key<a[middle])binarySearch(a,middle,key); 没有 return 任何东西。

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

这可能仍然无法像您预期的那样工作,但至少您将克服导致失控递归的主要、立即可见的原因。

因为不存在 s == 1 的情况。"Middle" 未初始化并且 [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);

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);
}

只有在s!=1时才初始化变量middle

我有 运行 这段代码并获得了输入值 Not Found 5

如果您运行在发布模式下编译您的代码,请尝试在调试模式下构建它,然后 运行 一步一步,您将看到直接使用 middle 而不为其指定特定值时会发生什么价值。这是有害的。

希望对您有所帮助。

一些注意事项:

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

改变

binarySearch(a, middle, key) 

return binarySearch(a, middle, key)

此外,请确保正确计算中间值。在 s == 1 的情况下,您没有正确初始化它。您很可能希望它从 0 开始。