【发布时间】:2017-01-29 06:37:08
【问题描述】:
我正在尝试通过仅使用 3 个参数 int value(我正在寻找的)、int values[](数组)、int n(大小数组)。下面的代码找到数字 2 并识别出 13 不存在,但找不到像 6 或 7 这样的数字。我认为问题出在最后的递归调用中。可能是指针问题。我确定其余代码工作正常。任何关于我可能出错的地方的想法将不胜感激。
#include <stdio.h>
#include <stdbool.h>
bool search(int value, int values[], int n);
int main(void)
{
int value = 6;
int values[] = {1, 2, 3, 4, 5, 6, 7};
int n = 7;
bool x = search(value, values, n);
if (x == true)
printf("found\n");
else
printf("not found\n");
}
bool search(int value, int values[], int n)
{
int midpoint = n/2;
if (n/2 <= 0)
{
return false;
}
if (value == values[midpoint])
{
return true;
}
if (value < values[midpoint])
{
return search(value, values, n/2);
}
else if (value > values[midpoint])
{
return search(value, values, n/2);
}
return false;
}
【问题讨论】:
-
你需要
values + n - n/2之类的东西(与values + n/2不同)。 -
我注意到我确实遵循了,因为 values 是数组的名称。添加数量 n/2 似乎没有意义。不过,我肯定会玩弄它。非常感谢您的回复!
-
if (n/2 <= 0)行错误。 0 是有效的数组索引。这就是为什么您的代码在数组切片的开头找不到任何值的原因。 -
你的逻辑完全错误,传递 (n/2) 行不通。如果搜索元素位于数组的右半部分,则您的代码将查看数组的左半部分。最后一个 if 和 else 条件行没有区别。
-
@RyanD。
values是main中的一个数组。它是search中的一个指针,因此您可以对指针进行调整。您的代码始终在搜索数组的前半部分。要使其搜索后半部分,您需要调整指针指向后半部分。