这是一个带有递归二进制搜索算法的C程序,但是当我运行它时,调试器说二进制搜索功能中存在访问分段错误。为什么会这样,我该如何解决这个问题?
这是递归二进制搜索函数:
int binSearch(int val, int numbers[], int low, int high)
{
int mid;
mid=(low+high)/2;
if(val==numbers[mid])
{
return(mid);
}
else if(val<numbers[mid])
{
return(binSearch(val, numbers, low, mid-1));
}
else if(val>numbers[mid])
{
return(binSearch(val, numbers, mid+1, high));
}
else if(low==high)
{
return(-1);
}
}
谢谢:)
答案 0 :(得分:5)
您必须在low == high
和val < ...
之前检查val > ...
,否则high
可能会小于low
,因此您的下一次递归可能会计算出无效mid
{{1}} 1}}
答案 1 :(得分:2)
您的边缘情况已关闭:具体而言,当您的low
和high
索引通过时,您会在到达low == high
测试之前继续以递归方式调用。重新安排测试:
int binSearch(int val, int numbers[], int low, int high) {
int mid = (low + high) / 2;
if (val == numbers[mid]) return mid;
if (val < numbers[mid]) {
if (mid > low) return binSearch(val, numbers, low, mid-1);
} else if (val > numbers[mid]) {
if (mid < high) return binSearch(val, numbers, mid+1, high);
}
return -1;
}
答案 2 :(得分:0)
试试这个:
修复了代码中的构造
int binSearch(int val, int numbers[], int low, int high)
{
int mid;
mid=(low+high)/2;
if(low<=high)
{
if(val==numbers[mid])
return mid;
else if(val<numbers[mid])
return binSearch(val, numbers, low, mid-1);
else
return binSearch(val, numbers, mid+1, high);
}
else
return -1;
}
答案 3 :(得分:0)
low
&lt; high
无法保证。如果不是这种情况,你将要搜索数组绑定。
为此添加健全性检查。
if (low < high)
return -1;
编辑:正如其他指出的那样你也可以检查开头是否低==高,但这并不能确保该函数的第一次调用具有合理的值。