我的二进制搜索实现有什么问题? #包括 内部B搜索(内部a[],内部n,内部lo,内部hi){ int mid; mid=(高+低)/2; 如果(a[mid]==n) 返回1; 如果(a[mid]>n),则为else b搜索(a、n、lo、mid); 其他的 b搜索(a、n、mid、hi); 返回0; } 内部主(空){ int n,a[7]={2,4,5,67,70,80,81}; inthi=6,lo=0,j; scanf(“%d”和“&n”); j=b搜索(a、n、lo、hi); 如果(j) printf(“发现”); 其他的 printf(“未找到”); 返回0; }

我的二进制搜索实现有什么问题? #包括 内部B搜索(内部a[],内部n,内部lo,内部hi){ int mid; mid=(高+低)/2; 如果(a[mid]==n) 返回1; 如果(a[mid]>n),则为else b搜索(a、n、lo、mid); 其他的 b搜索(a、n、mid、hi); 返回0; } 内部主(空){ int n,a[7]={2,4,5,67,70,80,81}; inthi=6,lo=0,j; scanf(“%d”和“&n”); j=b搜索(a、n、lo、hi); 如果(j) printf(“发现”); 其他的 printf(“未找到”); 返回0; },c,binary-search,C,Binary Search,输入:5输出:未找到 有人能告诉我为什么会得到这个结果吗?您需要解决几个大问题才能使它正常工作(请参阅下面代码注释中的详细信息) 将二进制搜索功能更改为以下内容: #include <stdio.h> int bsearch(int a[], int n, int lo, int hi) { int mid; mid = (hi + lo) / 2; if(a[mid] == n) return 1; else if(a[mid] &g

输入:5输出:未找到


有人能告诉我为什么会得到这个结果吗?

您需要解决几个大问题才能使它正常工作(请参阅下面代码注释中的详细信息)

将二进制搜索功能更改为以下内容:

#include <stdio.h>
int bsearch(int a[], int n, int lo, int hi) {
    int mid;
    mid = (hi + lo) / 2;
    if(a[mid] == n)
        return 1;
    else if(a[mid] > n)
        bsearch(a, n, lo, mid);
    else
        bsearch(a, n, mid, hi);
    return 0;
} 

int main(void) {
    int n, a[7] = {2, 4, 5, 67, 70, 80, 81};
    int hi = 6, lo = 0, j;
    scanf("%d", &n);
    j = bsearch(a, n, lo, hi);
    if(j)
        printf("Found");
    else
        printf("Not Found"); 
    return 0;
 }
intb搜索(inta[],intn,intlo,inthi)
{
//添加基本情况
如果(高<低)
返回0;//未找到
int mid;
mid=(高+低)/2;
如果(a[mid]==n)
返回1;
如果(a[mid]>n),则为else
return b搜索(a,n,lo,mid-1);//添加return
其他的
return b搜索(a,n,mid+1,hi);//添加return
} 

p.S.:根据您在
main()
正文中的用法,您实际上只需要返回
0/1
来指示是否包含该值。我建议您使用
bool
return类型以使其更加清晰。

在递归调用中添加“return”,例如:

int bsearch(int a[], int n, int lo, int hi)
{
    // add base case
    if (high < low)  
        return 0; // not found 

    int mid;
    mid=(hi+lo)/2;
    if(a[mid]==n)
        return 1;
    else if(a[mid]>n)
        return bsearch(a,n,lo,mid-1); // add return
    else
        return bsearch(a,n,mid+1,hi); // add return
} 
否则,当您在bsearch中返回1时,它不会一直返回到main


这将使它工作5年。您还有其他bug,所以请尝试使用许多值,并使用IDE和/或printf来查看发生了什么。祝你好运,玩得开心

这是因为
返回0bsearch
函数中的code>语句,因为您只是在丢弃递归调用返回的值。在递归函数中,必须首先确定基本情况。在您的
b搜索中,基本情况应该是

    return bsearch(a,n,lo,mid);

您知道stdlib.h中有一个二进制搜索(同名)吗?在您的b搜索方法中,您是否希望将“return b搜索(a,n…)”放在else if中?应该是
return b搜索(a,n,lo,mid),其他同上。如@SaviourSelf所示,递归调用没有返回结果,导致返回0。这是一个不太可能帮助其他人的错误,所以我投票决定关闭。如果(根据他在main中的用法)他只是试图确定是否找到了值,那么他返回1没有什么错。。。但是,如果返回一个无效值以指示未找到任何内容,则返回找到它的位置会更有用。为此,您可能应该更改最后的
返回0
返回-1
(这将破坏OP主功能中的逻辑)。@mah添加了
返回1
以使其一致。谢谢。
return
不会使它递归。事实上,它是递归的。它只是不处理递归调用中返回的值。
low <= hi
int bsearch(int a[], int n, int lo, int hi) {
    // first check for the base condition here
    // if(hi < low) return 0;

    int mid;

    // can cause integer overflow. should be
    // mid = lo + (hi - lo) / 2; 

    mid = (hi + lo) / 2; 
    if(a[mid] == n)
        return 1;
    else if(a[mid] > n)

        // you are doing nothing with the value returned
        // think of the function call as an expression
        // return the value of the expression
        // should be
        // return besearch(a, n, lo, hi);

        bsearch(a, n, lo, mid); 
    else
        // same follows here
        // should be
        // return bsearch(a, n, mid, hi);

        bsearch(a, n, mid, hi); 

    // finally you will always return 0 because this statement is always executed
    // all cases have been taken care of.
    // no return statement needed here
    return 0; 
}