【问题标题】:Loop controls inside function in cc中函数内部的循环控件
【发布时间】:2012-03-14 16:52:37
【问题描述】:

我目前正在尝试使用二进制搜索,如果它没有找到任何东西,我不希望它返回 -1 我只是希望它返回下一个最佳解决方案给我的目标。现在由于一些奇怪的原因,我的 if 语句没有被捕获,我不知道为什么。我唯一想到的可能是范围?但我不完全确定它是否只是函数在 c 中的工作方式,我忘记了一个小细节。

int binary_search(int list[][4], int bottom, int top,  int hit)
{

  printf("bottom: %d top %d \n", bottom,top);

  if (bottom > top)
    {
      if (list[top][0]<= hit && list[top][1] >= hit)
        return top;
      else if (list[bottom][0] <= hit && list[bottom][1] >= hit)
        return bottom;
    }
  int middle = (top+bottom)/2;

  if (hit < list[middle][0])
    return binary_search(list, bottom, middle-1, hit);

  else if (hit > list[middle][0])
    return binary_search(list, middle+1, top, hit);

  else if (hit == list[middle][0])
    return middle;


}

【问题讨论】:

  • return = top ?这甚至不会编译,“循环”是指“递归”吗?这是我在这里看到的唯一重复行为......
  • 下一个最佳解决方案是什么意思?函数名肯定是在搜索
  • 我在返回部分犯了一个错误,但是当我取出相等时它仍然给我带来麻烦,对于错过的类型感到抱歉。
  • @Ed 我最初搜索的是一系列日期目标我例如寻找第 8 天:[1] 开始 1 结束 2 [2] 开始 10 结束 12
  • 编写你的函数,如果它找不到元素,则返回 -1。一旦你让它正常工作,然后考虑如何修改返回 -1 的“未找到”基本情况,以便它返回最接近的答案。

标签: c function loops


【解决方案1】:

考虑hit &gt; list[middle][0]hit &lt;= list[middle][1] 的情况,在我看来,在这种情况下,您应该返回middle,但实际上您在排除列表[中间] 中的范围后再次递归到binary_search

【讨论】:

  • 是的,在我回头看之后,我只是重写了它并发现了一些我滚动的逻辑错误
猜你喜欢
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多