我正在寫一個二進制搜索的實現在C和我得到無限遞歸沒有明顯的(對我)的原因。我的繼承人代碼:無限遞歸:二進制搜索和斷言
/*Orchestrate program*/
int main(int argc, char* argv){
int array[] = {1,2,3,3,3,6,7,8,9,9,20,21,22};
int length = 13;
int key = 23;
binary_search(key, array, 0, length - 1);
return 0;
}
int binary_search(int key, int array[], int first_index, int last_index){
int middle;
middle = (first_index + last_index)/2;
if (first_index == last_index){
if (array[middle] == key){
printf("%d has been found at position %d\n", key, middle+1);
}
printf("item not found");
}
else if (key > array[middle]){
binary_search(key, array, middle, last_index);
}
else if (key < array[middle]){
binary_search(key, array, first_index, middle);
}
}
根據我的主鍵的值,我想問題出在第一否則如果,但我不知道爲什麼。如果我要刪除first_index == last_index
行,則該算法可以正常工作,但只能在該項目位於數組中時使用。如果該項目不在數組中,我自然會得到無限遞歸。
此外,我試圖通過刪除first_index == last_index
行並將return -1;
放在函數的末尾來解決此問題,但我遇到了與現在相同的問題。
編輯:
放在一起,我從幾個不同的用戶收到的諮詢件,我來到了以下解決方案(由一個錯誤和未嵌套的決定固定關斷):
void binary_search(int key, int array[], int first_index, int last_index){
int middle;
middle = (first_index + last_index)/2;
if (array[middle] == key){
printf("%d has been found at position %d\n", key, middle+1);
}
if (first_index == last_index){
printf("item not found");
}
else if (key > array[middle]){
binary_search(key, array, middle + 1, last_index);
}
else if (key < array[middle]){
binary_search(key, array, first_index, middle - 1);
}
}
我有一個後續問題:有沒有辦法使用斷言來幫助我自己找到這個解決方案? (我只是學習斷言所以我不知道我在哪裏可以應用它們)
逐行掃描調試器中的代碼。如果你認爲它很重要,請減小數組的大小。 –
只要看看你的代碼:如果'first_index'和'last_index'相差1呢?這也是遞歸應該停止的情況,並且不是 – valdo
1.嘗試在數組「{1}」中尋求值「1」。結果是什麼? – CiaPan