我使用重复进行了这个二进制搜索,然而,当我得到答案(布尔值)时,我似乎偶然发现了重复,并且无法从函数中得到正确的答案。 有人可以帮忙吗?请评论代码。
// binary search
bool
search(int value, int array[], int n)
{
// the array has more than 1 item
if (n > 1)
{
int m = (n/2);
// compares the middle point to the value
if (value == array [m])
return true;
// if the value given is lower than the middle point of the array
if (value < array [m])
{
int *new_array = malloc (m * sizeof(int));
// creating a new array with the lower half of the original one
memcpy(new_array, array, m * sizeof(int));
// recalling the function
search (value, new_array, m);
}
// if the value given is greater than the middle point of the array
else
{
int *new_array = malloc (m * sizeof(int));
// creating a new array with the upper half of the original one
memcpy(new_array, array + (m + 1), (m * sizeof(int)));
// recalling the function
search (value, new_array, m);
}
}
else if (n==1)
{
// comparing the one item array with the value
if (array[0] == value)
return true;
else
return false;
}
if (true)
return true;
else
return false;
}
答案 0 :(得分:0)
您需要返回递归搜索的值。
return search (value, new_array, m);
否则当你打电话给搜索时,你只是丢掉了答案
答案 1 :(得分:0)
您应该return search(...);
,而不仅仅是调用search()
方法 - 否则返回值不会冒泡。
此外,请注意,此算法为O(n)
(数组大小呈线性),并且内存泄漏且效率非常低,因为您在每次迭代中复制了一半数组。
实际上,它可能使算法比元素的幼稚线性搜索慢得多。
一个好的二进制搜索不需要复制一半的数组 - 它只是“看起来”它的一半。可以通过发送array+m
作为数组(对于较高的一半)来实现,只有减少n
对于下半部分就足够了。
答案 2 :(得分:0)
正如amint所提到的,复制数组完全违背了进行二进制搜索的目的。其次,我认为你的意思是递归,而不是重复。
要考虑的事情:不要复制数组,而是考虑如何通过将一组索引传递给数组(如开头和结尾)来实现相同的结果。
关于你的实际问题,如何通过递归返回布尔值。关于从递归函数返回值的事情是每次迭代都必须传递该值。您可以将其视为一系列责任委托。第一个电话就像是公司的负责人。他不做所有的工作,所以他把它委托给他的助手,但他先做了一件工作。然后助手有一个助手等。乌龟一直向下;)
为了获得价值,链中的每个人都必须将它交还给他们之前的人。回到编程,这意味着每次递归调用搜索时,都需要返回该值。
最后,一旦你有了这些东西,你需要更好地定义你的基础案例。我认为这就是你要做的事情
如果是真的)
返回true;
其他
返回false;
然而,正如H2CO3所指出的,这没有多大意义。实际上,您之前的if语句if (n == 1) ...
应该确保之后的代码永远不会被执行。