使用递归的二进制搜索

时间:2013-04-22 18:07:28

标签: c++ search binary

我无法弄清楚为什么这不会返回键,它似乎是跳过这一步,逻辑我觉得是直的,如果midptr小于键然后搜索右边的其他搜索左侧。但它没有返回键,它返回-1。救命?这是代码和功能

#include<iostream>
using namespace std;


int binsrch(int *raw, unsigned int size, int key);




int main()
{
  int raw[] = {1,3,5,7,11,23, 48};
  cout << binsrch(raw, 7, 11) << endl;


  system("pause");
  return 0;
}



int binsrch(int *raw, unsigned int size, int key)
{
    int *begptr, *endptr ,*midptr;
//see if we already have the key

if(*raw == key)
  return key;

begptr = raw;
endptr = raw + (size - 1);
midptr = raw + (size / 2);

cout << "#" <<*midptr << " size:" << size<<  endl;
if(*midptr == key)
{
  return key;
}
else  if( *midptr < key) //Search Right
{
  cout << "#" <<*(midptr+1) << " size:" << size<<  endl;
  binsrch(midptr + 1, size / 2, key);
}
else if(*midptr > key) //Search Left
{
    cout << " #" <<*midptr << " size:" << size<<  endl;
    binsrch(begptr, size / 2, key);
}

return -1;
}

3 个答案:

答案 0 :(得分:5)

您忘记了return语句。您应该返回递归调用的结果:

binsrch(midptr + 1, size / 2, key);

应该是

return binsrch(midptr + 1, size / 2, key);

否则,您的初始调用将执行正文的其余部分并始终返回-1,除非您在第一次递归之前找到该键。

通过添加return语句,您可以打破递归调用的控制流(即,您不返回“未找到”值),并且您将在调用堆栈中一直传播最后一个返回值,直到第一次调用,最后返回你想要的值。

答案 1 :(得分:0)

一切正常,但您没有返回正确的值。 在else-if语句中,您将函数称为递归函数,但返回的值不会传递给初始调用! 尝试:

return binsrch(midptr + 1, size / 2, key);

return binsrch(begptr, size / 2, key);

这应该有效。

-Edit:嗯,我想我一直在慢下来;)

答案 2 :(得分:0)

你还应该添加:

if(endptr == midptr) return -1;

计算endptr后避免搜索元素的无限循环,而不是21 ......等数组