我正在實作遞回二進制搜索,我遇到了這個讓我很困惑的問題。這是我最初運行的代碼:
'''
int recursiveBinarySearch(int* arr, int start, int end, int key){
int middle = (start end) / 2;
if (start >= end)return -1;
if (arr[middle] == key)return middle;
if (arr[middle] < key) {
recursiveBinarySearch(arr, middle 1, end, key);
}
if (arr[middle] > key) {
recursiveBinarySearch(arr, start, middle-1, key);
}
}
'''
現在,據我了解,一旦達到基本情況,唯一回傳的應該是從基本情況回傳的值,因為沒有其他呼叫回傳任何內容。但是,很明顯我錯了,因為這沒有給出正確的答案,而且顯然我需要在每個遞回呼叫之前都有一個 return 陳述句才能使該演算法起作用,正如我后來發現的那樣。所以我的問題是,為什么我們需要有return宣告?我的解決方案不起作用的確切原因是什么?
uj5u.com熱心網友回復:
假設,X是我們從主函式呼叫的函式。并且有一個Y從 function 呼叫的函式X。函式進行Y一些計算并計算X. 所以你應該只呼叫函式Y并回傳它的結果,如下所示。
Y() {
// Some computation
return result;
}
X() {
return Y();
}
main() {
res = X();
}
現在這樣想,每個遞回呼叫都是一個單獨的函式,它正在執行某些任務。所以你的recursiveBinarySearch函式應該回傳答案,但它自己不能計算,所以它正在呼叫其他一些函式(在這種情況下是同一個函式,因此呼叫遞回)來獲得結果。所以它會繼續呼叫函式并將問題分解成更小的問題,直到它達到它會得到答案并最終回傳它的基本情況。
uj5u.com熱心網友回復:
您的代碼中有一個錯誤,arr[middle]==key應該在之前進行檢查start>=end。此外,您應該回傳recursiveBinarySearch.
這應該作業
int recursiveBinarySearch(int* arr, int start, int end, int key)
{
int middle = (start end) / 2;
if (arr[middle] == key) return middle;
if (start >= end) return -1;
if (arr[middle] < key) {
return recursiveBinarySearch(arr, middle 1, end, key);
}
else {
return recursiveBinarySearch(arr, start, middle-1, key);
}
}
測驗代碼:https : //godbolt.org/z/8s6hWMKjj
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405889.html
標籤:
