c - 如果语句不识别真实条件?

标签 c binary-search

我在使用这种二分查找算法时遇到了问题。以下是对变量的解释。

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/

相关文章:

binary-search - 下界与二分搜索

c# - 我可以对 guids 列表进行排序并进行二进制搜索吗?

c++ - 将只读数据安全地传递给新线程

algorithm - 不定长数组

c - 设计 if-else 语句有关语法的几个问题

python - 如何在 C 程序中运行 Python 可执行文件(.py)(例如使用 execvp)?

c# - BinarySearch 没有预期的结果

java - 卡在 java 赋值,二进制搜索算法上

C - 连接函数 - 无效参数错误

c++ - 如何同时等待 I/O 完成端口和事件?