程序在查找数组中没有的数字时崩溃。当我搜索数组中可用的元素时,代码工作正常。非常感谢。
#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");
}
答案 0 :(得分:1)
代码if(key<a[middle])binarySearch(a,middle,key);
不会返回任何内容。
尝试if(key<a[middle]) return binarySearch(a,middle,key);
这可能仍然无法按照你的意愿行事,但至少你会超越主要的,立即可见的失控递归原因。
答案 1 :(得分:1)
更改
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);
}
变量middle
仅在s!=1
。
我已运行此代码并获得输入Not Found
的值5
。
如果您在发布模式下运行代码,请尝试在调试模式下构建代码并逐步运行,您将看到直接使用中间版时会发生什么,而不会为其指定特定值。这是有害的。
希望这有帮助。
答案 2 :(得分:0)
因为没有情况如果s == 1.“中间”没有被初始化并且[中间]可能会崩溃,或者它会变得无限。
答案 3 :(得分:0)
一些注意事项:
递归函数的每个分支都应该返回一些东西。您需要修改递归调用以返回调用
更改
binarySearch(a, middle, key)
到
return binarySearch(a, middle, key)
另外,确保正确计算中间值。在s == 1的情况下,你没有正确地初始化它。你最希望从0开始。