繁体   English   中英

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

[英]Binary Search in C using recursion

该程序在查找数组中不可用的数字时崩溃。当我搜索数组中可用的元素时,代码可以完美工作。非常感谢。

#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); 不返回任何东西。

尝试if(key<a[middle]) return binarySearch(a,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);

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

我已经运行了这段代码,并获得了输入5的值Not Found

如果您在发布模式下运行代码,请尝试在调试模式下进行构建,然后逐步运行,您将看到直接使用Middle而不分配特定值时会发生什么。 这是有害的。

希望这可以帮助。

因为在任何情况下s == 1都是不可能的。“ Middle”未初始化并且a [middle]可能会崩溃,否则它将变为无限大。

一些注意事项:

递归函数的每个分支都应返回一些内容。 您需要修改递归调用才能返回调用

更改

binarySearch(a, middle, key) 

return binarySearch(a, middle, key)

另外,请确保中间值计算正确。 在s == 1的情况下,您没有正确地对其进行初始化。您可能希望将其从0开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM