这个搜索功能在我使用clang在Linux上编译时有效,但在使用MinGW gcc的Windows上,我没有得到正确的答案。代码中包含一个数组,其中我正在寻找的数值显然在数组中。所以输出应该是#34;找到它!"。任何人都知道Windows会出现什么问题?
#include <stdio.h>
#include <stdbool.h>
bool re_search(int value, int values[], int first, int last);
int main(void)
{
int value = 12;
int values[] = {2,4,5,12,23,34};
int n = 6;
if (re_search(value, values, 0, n-1))
{
printf("Found it!\n");
}
else
{
printf("Did not find it\n");
}
return 0;
}
bool re_search(int value, int values[], int first, int last)
{
last = last-1;
int middle = (first+last)/2;
while (first <= last)
{
if (value == values[middle])
{
return true;
}
else if (value > values[middle])
{
first = middle + 1;
middle = (first + last) / 2;
return re_search(value, &values[middle], first, last);
}
else
{
last = middle - 1;
middle = (first + last) / 2;
return re_search(value, &values[first], first, last);
}
}
return false;
}
答案 0 :(得分:3)
你的递归调用return re_search(value, &values[middle], first, last);
传入一个从中点开始的数组,以及从整个数组开始计算的新值first
。你想做一个或另一个;不是两个。
也就是说,您先拨打:
values == {2,4,5,12,23,34}
first == 0
last == 5
在第一次迭代中,您尝试middle == 2
,因此values[middle]
为5,小于12.然后使用
values == {12,23,34}
first == 3
last == 5
而且 - 亲爱的! - 即使values[first]
现已超出范围。很有可能,在Linux上你得到(非)幸运并且在阵列结束时达到了你正在搜索的价值。
答案 1 :(得分:1)
无论是GCC还是Windows。
bool re_search(int value, int values[], int first, int last){
if (first <= last){
int middle = (first+last)/2;
if (value == values[middle]){
return true;
} else if (value > values[middle]){
return re_search(value, values, middle + 1, last);
} else {
return re_search(value, values, first, middle - 1);
}
}
return false;
}
bool re_search(int value, int values[], int first, int last){
while (first <= last){
int middle = (first+last)/2;
if (value == values[middle]){
return true;
} else if (value > values[middle]){
first = middle + 1;
} else {
last = middle - 1;
}
}
return false;
}