我在使用这种二分查找算法时遇到了问题。以下是对变量的解释。
value:数组中正在查找的数字
values[]:被搜索的数组
n:数组中元素的个数
high:被搜索数组部分的最高元素(按零索引位置)
low:最低元素(按零索引位置)正在搜索的数组部分
我的问题不是递归。正在搜索的数组部分以“值”为中心,并且满足下面标识的条件。问题是我的 if 语句似乎没有意识到它们是。我知道条件已满足,因为当我为每个递归打印出值[高]、值[中]和值[低]时,它表明它们是。
int search(int value, int values[], int n, int high, int low)
{
if (n <= 0)
{
return 1;
}
int middle = (high + low) / 2;
///condition #1
if (value == values[middle])
{
return 0;
}
//conditions #2 and #3 (account for the maxes and mins of the array because the operation to find middle truncates)
else if ( values[middle]==values[low] || values[middle]==values[high])
{
return 0;
}
else if (value > values[middle])
{
low = middle;
search(value, values, n, high, low);
}
else if (value < values[middle])
{
high = middle;
search(value, values, n, high, low);
}
return 2;
}
这是怎么回事?
最佳答案
仔细看这段代码:
else if (value > values[middle])
{
low = middle;
search(value, values, n, high, low);
}
else if (value < values[middle])
{
high = middle;
search(value, values, n, high, low);
}
请注意,在这些情况下,您会递归调用 search
函数,但不会对返回值执行任何操作。这意味着 search
返回的任何值都将被丢弃,代码照常继续,最终返回 2
。
要解决此问题,请添加这些 return
语句:
else if (value > values[middle])
{
low = middle;
return search(value, values, n, high, low);
}
else if (value < values[middle])
{
high = middle;
return search(value, values, n, high, low);
}
一般来说,如果您怀疑 if
语句条件未触发,则值得使用调试器慢慢逐步完成。这样做可能会让您注意到您 (1) 正确地递归调用函数,但 (2) 返回并丢弃返回值。
这里的代码可能还有其他问题,但这肯定是您需要解决的问题。
关于c - 如果语句不识别真实条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38468878/