我的二进制搜索实现有什么问题? #包括 内部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; }
输入:5输出:未找到我的二进制搜索实现有什么问题? #包括 内部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
有人能告诉我为什么会得到这个结果吗?您需要解决几个大问题才能使它正常工作(请参阅下面代码注释中的详细信息) 将二进制搜索功能更改为以下内容:
#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来查看发生了什么。祝你好运,玩得开心 这是因为
返回0始终执行bsearch
函数中的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;
}