我编写了以下程序来实现已排序数组的二进制搜索:
int flag=0;
void binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(a[middle]==x)
{
printf("%d has been found at postion %d!\n", x, middle+1);
flag=1;
}
else
if(x > a[middle])
binarysearch(x, a, middle, n);
else
if(x < a[middle])
binarysearch(x, a, m, middle);
}
main()
{
int i, size, x;
int a[100];
printf("Enter the size of the list : ");
scanf("%d", &size);
printf("Enter the list items in ascending order : \n");
for (i=0; i<size; i++)
scanf("%d", &a[i]);
printf("Enter the element to be found : ");
scanf("%d", &x);
binarysearch(x, a, 0, size-1);
if(flag != 1)
printf("%d has not been found in the list!", x);
}
这个程序的问题是,如果试图搜索不在列表中的项目,函数binarysearch
会一遍又一遍地递归调用自身。因此,flag
变量变得毫无意义。
程序是否有可能告诉用户他是否正在尝试执行此类搜索(不在阵列中的某些内容)?
我假设它不可能,因为它是二进制搜索算法的基本缺陷。请赐教。
答案 0 :(得分:8)
在开头检查m == n
。
if(m == n)
{
if(a[n] == x) { printf("found\n"); }
return;
}
如果没有x
,您会继续使用middle == n
和middle == m
给自己打电话。
答案 1 :(得分:2)
您的函数应使用返回值并返回在数组中找到它的索引
int binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(a[middle]==x)
{
printf("%d has been found at postion %d!\n", x, middle+1);
return middle;
}
else
if(x > a[middle])
return binarysearch(x, a, middle, n);
else
if(x < a[middle])
return binarysearch(x, a, m, middle);
//if it is not found in the whole array
return -1;
}
答案 2 :(得分:1)
你需要一个简单的案例来打破递归,即n == m
。如果这和x != a[middle]
成立,则此元素不在数组中:
void binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(n == m && x != a[middle])
{
printf("%d is not in the array", x);
return;
}
//...
或你的if else风格:
void binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(n == m && x != a[middle])
{
printf("%d is not in the array", x);
}
else
if(a[middle]==x)
//...
答案 3 :(得分:0)
我认为你对递归缺乏一些基本的了解。递归函数在到达其基本情况时应返回值。如果您知道我的意思,您的代码最终将导致“StackOverflow”:)