我有一个学校的分配,要求我创建一个递归二进制搜索功能。我不允许更改功能签名。 我对指针的体验并不是最好的,我认为我的问题就在那里。 我得到了一个Stackoveflow,但我真的不明白
bool contains(const int* pBegin, const int* pEnd, int x)
{
int length = pEnd - pBegin;//gives me the length of the array
const int* pMid = pBegin + (length / 2);
if(length == 1)
{
if(*pMid != x)
return false;
return true;
}
else if(x < *pMid)
return contains(pBegin, pMid-1, x);
else
return contains(pMid, pEnd, x);
}
void main(){
setlocale(LC_ALL, "swedish");
int arr[10];
for(int i = 0; i < 10; ++i)
arr[i] = i;
bool find = contains(&arr[0], &arr[10], 3);//arr[10] points to the index after the array!
cout <<"found = "<< find << endl;
system("pause");
}
有人可以向我解释我做错了什么,以及如何以更好的方式做到这一点?
答案 0 :(得分:1)
堆栈溢出是由于递归太深。 它不太可能你的数组足以真正成为一个问题,所以你所拥有的是无限递归... contains()不断调用自己并且无法检测到它。
看看这是如何可能的,并添加断言。
您的代码假定 pEnd&gt; pBegin
您的代码无法处理这种可能性。
#include <assert.h>
bool contains( ... )
{
assert(pBegin > pEnd);
...
现在,如果这个假设不正确,它将会中止。
(pEnd&gt; pBegin)有两种可能性是假的,即&#34;&lt;&#34;或&#34; ==&#34;。 你的代码在这两种情况下做了什么?
下面的剧透..
长度可以为零,不会被处理。