0

我不知道为什么这不会返回密钥,它似乎跳过了这一步,我觉得逻辑是直的,如果 midptr 小于 key 则向右搜索,否则向左侧搜索。但它没有返回键,它返回-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;
}
4

3 回答 3

5

你忘记了return陈述。您应该返回递归调用的结果:

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

应该

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

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

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

于 2013-04-22T18:11:45.463 回答
0

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

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

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

那应该行得通。

-编辑:好吧,我想我一直很慢;)

于 2013-04-22T18:20:53.620 回答
0

您还应该添加:

if(endptr == midptr) return -1;

在计算 endptr 以避免无限循环后,如果搜索元素不在数组中,例如 21.. 等

于 2013-04-22T18:20:57.093 回答