我试图在数组上实现二进制搜索。我试图消除这个错误,我得到编译时,但无法。这是我为二进制搜索创建的函数:
bool BinSearch(int key, int Array[], int min, int max)
{
if (max < min)
return false;
else
{
int mid = (min + max)/2 ;
if (key > Array[mid])
BinSearch(key, Array, mid+1, max);
else if (key < Array[mid])
BinSearch(key, Array, min, mid-1);
else
return true;
}
}
最佳答案
您的主要错误是,您对BinSearch
的递归调用缺少返回语句。为了使这个解释更容易理解,我在您的代码中添加了一些括号,使所有内容都更加明确。注意下面的代码与您的代码相同,只是有一些(多余的)括号和更合适的缩进。
现在假设我们有一个代码路径,其中max < min
是false
然后key > Array[mid]
是true
。因此,我们执行了以下程序,并在代码中进行了注释:
bool BinSearch(int key, int Array[], int min, int max)
{
if (max < min) { // Step 1, false
return false;
}
else {
// Step 2, start the else block
int mid = (min + max)/2 ;
if (key > Array[mid]) { // Step 3, true
BinSearch(key, Array, mid+1, max); // Step 4 call BinSearch
// Step 5, finished with call to BinSearch
}
else if (key < Array[mid]) {
BinSearch(key, Array, min, mid-1);
}
else {
return true;
}
// Step 6, Done with else block
}
// Step 7, Done with function, no return statement
}
如果
key > Array[mid]
是false
而key < Array[mid]
是true
则会发生类似的事情。这应该清楚为什么编译器正确地认为存在没有返回的代码路径。正如前面在评论中指出的那样,解决方案是做return BinSearch(...)
。关于c - 控制可能会到达非无效函数的末尾……执行二进制搜索时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31735517/