0

我正在尝试查找并修复此代码的问题。它是通过递归实现的二分查找。我不知道为什么它返回堆栈溢出和崩溃。

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”被调用时,它需要奇怪的参数,就像在这张图片中一样。

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

4

4 回答 4

1

You should compute the average of the pointers and check what it's the value of the element hallway between them. Instead you compute the average of the values pointed by them which is significantly different.

于 2013-01-26T19:34:01.063 回答
1

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

尝试像这样声明它:

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

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

此外,您还需要第二个终止条件(当它找不到时)。就像是:

if (((middle == pEnd) && (x > *middle)) ||
         ((middle == pBegin) && (x < *middle))) {
  // Terminating condition                                                                                                                                                                              
  return false;
}
于 2013-01-26T19:28:38.507 回答
0

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

于 2013-01-26T19:35:42.157 回答
0

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

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

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

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

于 2013-01-26T19:45:50.527 回答