【问题标题】:Wrong output for binary search for extreme elements in a sorted array对排序数组中的极端元素进行二进制搜索的错误输出
【发布时间】:2016-08-03 14:51:12
【问题描述】:
#include <iostream>

using namespace std;

int bsearch(int x, int lo, int hi, int a[])
{
    if(lo <= hi) {
        int mid = lo + (hi - lo)/2;
        if(x == a[mid]) {
            cout<<mid<<endl;
           return mid;
        } else if(x < a[mid]) {
            hi = mid - 1;
            bsearch(x, lo, hi, a);
        } else {
            lo = mid + 1;
            bsearch(x, lo, hi, a);
        }
    }

    return -1;
}

main()
{
    int a[5] = {12, 13, 15, 18, 20};
    cout << bsearch(20, 0, 4, a);
}

以上是C++中二分查找的实现。我编写了一个函数来执行二进制搜索,该函数将排序数组作为输入。在主函数内部,我将一个排序整数数组作为参数传递给函数。当我搜索不位于数组末端的元素时,该程序似乎工作正常,但为极端元素提供了错误的输出。为了找出错误,我在函数体中包含了一个“cout”语句来打印“mid”的值。令人惊讶的是,即使在数组极端元素的情况下,mid 的值也被正确计算,但是对于极端元素,程序的输出仍然是错误的。谁能指出它有什么问题?

【问题讨论】:

  • 你应该做一些更多调试。逐步检查整个过程,找出哪个计算出错了。
  • 你对bsearch进行所有这些递归调用,然后丢弃它们的结果。顶级呼叫(来自main 的呼叫)然后落入return -1;。两次递归调用应该是return bsearch(...);
  • 你应该在递归调用中放置一个returnreturn bsearch(x, lo, hi, a);

标签: c++ binary-search


【解决方案1】:

您在递归调用 bsearch 函数的行中缺少 return 语句。

这似乎有效:

int bsearch(int x, int lo, int hi, int a[])
{
    if(lo <= hi)
    {
        int mid = lo + (hi - lo)/2;
        if(x == a[mid])
        {
           return mid;
        }
        else if(x < a[mid])
        {
            hi = mid - 1;
            return bsearch(x, lo, hi, a);
        }
        else
        {
            lo = mid + 1;
            return bsearch(x, lo, hi, a);
        }
    }
    return -1;
}

【讨论】:

  • 谢谢。问题在于我对递归调用的理解。为了清楚起见,递归调用函数中的 return 语句将控制权转移给调用它的程序,对吗? (在这里我假设它会将控制权返回给“主”函数。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2021-12-27
  • 1970-01-01
  • 2010-12-25
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多