我99%肯定我的问题是我每次开始都设置为低至零。但我不知道如何保持低一致代表低指数,无论我的递归深度。如果它准确地告诉我低指数的指数我不认为我会有问题。
到目前为止,这是我的代码:
int recBSearch(vector<int> v, int size, int item)
{
int index = size / 2;
int curr = v[index];
int low = 0;
int high = size -1;
if (v[index] == item)
return index;
else if (v[index] > item)
{
high = index;
index = (high+low)/2;
size = high - low;
return recBSearch(v, size, item);
}
else if (v[index] < item)
{
low = index;
index = (high+low)/2;
size = high - low;
return recBSearch(v, size, item);
}
return -1;
}
答案 0 :(得分:6)
当您尝试在向量的上半部分进行搜索时,这将无效,因为您真正需要创建的是向量的一部分。
已经有二进制搜索,但如果您决定自己编写,请在参数中使用迭代器范围。 (您可以传入两个普通迭代器或一个增强范围)。
如果找不到迭代器位置,则需要-1,因此在切片(迭代器范围)中,如果找到它,则需要指定起始索引号。
您也可以传递矢量(通过const引用)和您希望搜索的范围。
您的最后一行无法访问。相反,在进行任何评估之前,它应该是递归的终止条件。 (如果你的范围是空的)
通过引用传递并使用索引号(最简单)迭代的版本将如下所示:
int recBSearch( std::vector<int> const& vec, int start, int end, int value )
{
if( start == end )
{
return -1;
}
int index = (start + end) / 2;
// continue from here
}
end
表示“超过最后一个元素”,因此如果向量的大小为5,则第一次迭代将传递0和5.如果向量为空,则传递0和0。
作为练习,“可以用3个参数完成”吗?
...是
typedef std::vector<int>::const_iterator citer;
int recBSearch( citer start, citer end, int value )
{
if( start == end )
{
return -1;
}
citer middle = start + (end-start)/2;
if( *value == *middle )
{
return middle - start;
}
else if ( *value < *middle )
{
return recBSearch( start, middle, value );
}
else // note the change here
{
int res = recBSearch( middle+1, end, value );
if( res == -1 )
return -1;
else
return res + 1 + (middle-start);
}
}
答案 1 :(得分:2)
如果要递归,您的方法需要将搜索范围作为参数。否则,你无法跟踪在rucursive调用中搜索的位置,假设你总是给函数提供完整的向量。
所以你的方法签名应该是:
int recBSearch(vector<int> v, int first, int last, int item)
答案 2 :(得分:0)
二进制搜索基本上是将你的范围分成两半并在每一个中搜索。您的代码显示您在两个分支的下半部分操作。您需要在第二个v
以及else if
而不是size/2
中将size
向量的较高一半传递给递归调用。