【问题标题】:Binary Search Seg Fault二分查找段错误
【发布时间】: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 &lt;= 0) 行错误。 0 是有效的数组索引。这就是为什么您的代码在数组切片的开头找不到任何值的原因。
  • 你的逻辑完全错误,传递 (n/2) 行不通。如果搜索元素位于数组的右半部分,则您的代码将查看数组的左半部分。最后一个 if 和 else 条件行没有区别。
  • @RyanD。 values 是 main 中的一个数组。它是search 中的一个指针,因此您可以对指针进行调整。您的代码始终在搜索数组的前半部分。要使其搜索后半部分,您需要调整指针指向后半部分。

标签: c search recursion binary


【解决方案1】:

是的,问题是当你用数组的上半部分调用搜索时,你应该用偏移量来传递它

return search(value, values + (n + 1) / 2, n / 2);

请注意,我还跳过了您已经比较过的中间元素,用于n 为奇数的情况。您当然可以优化递归调用,始终注意正确计算长度。

【讨论】:

  • 这个也有问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2022-01-11
  • 2014-09-10
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多