递归二进制搜索实现崩溃...为什么?

时间:2013-01-26 19:22:31

标签: c++ pointers recursion binary-search

我正在尝试查找并修复此代码的错误。这是通过递归实现的二进制搜索。我不知道为什么它会返回堆栈溢出和崩溃。

bool find( const int x, const int* pBegin, const int* pEnd)
{
    int medel = (*pBegin +(( *pEnd-1) - *pBegin)/2) ;

    if(x == medel)
        return true ;

    else if( x > medel) 
    {
        int begin = (medel +1);

        return find (x, &begin, pEnd);
    }
    else if( x< medel)
    {
        int last = (medel-1);

        return find(x,pBegin, &last);
    }

}


void main()
{
    int arr[10];
    for (int i=0;i<10;++i)
        arr[i] = i;
    bool hittat = find(7, &arr[0], &arr[9]);
    cout << "hittat = " << hittat << endl;

    system("pause");
}

当我调试代码时,我看到当调用函数“find”时,它需要奇怪的参数,例如在this pic中。

它应该取0和9,而不是这些巨大的数字:/ 我的指针有什么问题吗?

4 个答案:

答案 0 :(得分:1)

您在某些地方使用medel(我假设应该middle)作为指向int的指针,但在其他地方使用int

尝试这样声明:

const int* middle = pBegin + (pEnd - pBegin + 1) / 2;

然后,当您想要访问存储在那里的内容时,请使用*medel

此外,您还需要第二个终止条件(因为它不会被发现)。类似的东西:

if (((middle == pEnd) && (x > *middle)) ||
         ((middle == pBegin) && (x < *middle))) {
  // Terminating condition                                                                                                                                                                              
  return false;
}

答案 1 :(得分:1)

您应该计算指针的平均值,并检查它们之间元素走廊的是什么。相反,您计算它们指向的的平均值,这是显着不同的。

答案 2 :(得分:0)

您正在使用medel将int和int上的指针混合,只需将其设置为指针并使用*medel

访问其数据

答案 3 :(得分:0)

您的图片中显示的问题看起来像是从您之前的问题中看到的原始代码中获取的。你有pEnd指向数组的末尾,因此不允许解除引用它(并产生奇怪的值)。

发布的代码不应该发生这种情况。

您当前的代码仅使用指向有效整数的指针。但是大多数都没有指向你的数组,所以你所做的不是数组中的搜索。该程序只是用整数进行计算。仅使用数组的第一个和最后一个元素的值。

该程序令人困惑,因为您将整数值作为指向其存储的指针传递。当您从指向数组的指针开始时,然后将指针混合到自动变量(beginend)中,您可以在其中存储计算值。 (你永远不会使用指向除第一个和最后一个之外的数组元素的指针。