[英]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.