簡體   English   中英

使用遞歸的二進制搜索

[英]binary search using recursion

我不知道為什么它不會返回鍵,似乎跳過了一步,我覺得邏輯是直截了當的,如果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;
}

您忘記了return聲明。 您應該返回遞歸調用的結果:

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

應該

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

否則,除非您在第一次遞歸之前找到鍵,否則您的初始調用將執行其余部分,並始終返回-1

通過添加return語句,您將中斷遞歸調用的控制流(即,您不返回“未找到”值),並且將最后一個返回值一直傳播到調用堆棧中,直到第一個調用,最后返回您想要的值。

一切正常,但是您沒有返回正確的值。 在else-if語句中,您將函數稱為遞歸函數,但是返回的值不會傳遞給初始調用! 嘗試:

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

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

那應該工作。

編輯:嗯,我想我來的很慢;)

您還應該添加:

if(endptr == midptr) return -1;

在計算endptr之后避免無限循環,以防搜索元素不在數組(例如21)中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM