我试图实现一个二进制搜索,其中n是我的数组的大小,并且它不能用于递归,只有当我不使用递归时它是否有效,我不会似乎明白为什么
int mid = 0;
int low = 0;
bool search(int value, int values[], int n)
{
do
{
mid = (low + n)/2;
if(values[mid] == value)
{
return true;
}
else if (values[mid]>value)
{
n= mid -1;
return search(value, values, n);
}
else if (values[mid]<value)
{
low = mid + 1;
return search(value, values, low);
}
}
while (n > low);
return false;
}
答案 0 :(得分:2)
问题是你调用递归调用,用指向下半部分的指针搜索数组的上半部分。因此,如果值在上半部分,则无法找到它。你需要这样的东西:
bool search(int value, int values[], int n) {
int mid = n/2;
if (n <= 0) {
return false;
} else if (values[mid] == value) {
return true;
} else if (values[mid] > value) {
return search(value, values, mid);
} else if (values[mid] < value) {
return search(value, values + mid + 1, n - mid - 1);
}
}
答案 1 :(得分:0)
您的计划是两种不同解决方案的混合体。你要么必须用循环或递归函数来解决这个问题。
你尝试使用的循环应该做这样的事情。这里不需要递归。
while (low <= high) {
mid = (low+high) / 2;
if (value < values[mid])
high = mid - 1;
else if (value > values[mid])
low = mid + 1;
else
return true;
}
return false;
如果需要使用递归,则不需要循环。你的答案可能如下:
bool search(int value, int values[], int low, int high ) {
if (low <= high) {
int mid = (low + high)/2;
if (values[mid] == value)
return true;
else if (value > values[mid])
return search(value, values, mid+1, high);
else
return search(value, values, 1, mid-1);
}
return false;
}
我在这里假设您可以定义自己的函数头。