我正在嘗試學習遞回,所以我決定實作一些使用遞回的演算法,如二進制搜索,但我有一些問題來理解為什么我們需要在這樣的情況下回傳:
int binarysearch(int *arr, int x, int left, int right){
if(right <= left){
return -1;
}
int mid = (left right) / 2;
if(arr[mid] == x){
return mid;
}
if(x < arr[mid])
return binarysearch(arr, x, left, mid - 1);
else
return binarysearch(arr, x, mid 1, right);
}
就像我們沒有價值,我們需要回傳我們需要的唯一值在引數中,但是當我洗掉 return 陳述句時,我得到了一些未定義的行為。有人可以向我解釋為什么我在洗掉 return 陳述句時得到了未定義的結果。
編輯:
- 這個回傳陳述句:
return binarysearch(arr, x, left, mid - 1); - 還有這個:
return binarysearch(arr, x, mid 1, right);
uj5u.com熱心網友回復:
這是因為回傳值必須通過每個被呼叫函式的回傳值傳播到原始呼叫者。
我將注釋每個呼叫,[i]只是為了區分對同一函式的不同呼叫。
假設你有 array { 1, 2 },你打電話
printf("%d", binarysearch[1](array, 2, 0, 1));
然后
mid = 0(因為兩個整數相除時四舍五入)2 < arr[0] ~ 2 < 1 = 0(在 C 中的0意思false)
因此binarysearch[2](array, 2, 1, 1);被稱為 inside binarysearch[1]。在這個新函式中mid = 1和arr[1] == 2,所以函式binarysearch[2]回傳1。
但是binarysearch[2]被呼叫在里面binarysearch[1]所以值1現在在里面binarysearch[1],為了得到值到printf,我們必須再次回傳它。
如果您洗掉回傳(我很驚訝編譯器甚至允許您這樣做),則回傳的值將binarysearch[2]被丟棄并binarysearch[1]結束而不將值回傳到printf,但printf期望值在那里,所以它只需要任何在那一點在記憶體中,這會導致未定義的行為。
我希望這有點可以理解。
uj5u.com熱心網友回復:
我從你的問題中了解到,為什么我們需要回傳函式中已經存在的陳述句。
所以首先遞回的概念是函式不斷地呼叫自己。
其次,二分查找的概念是通過將串列中的一個元素一分為二來找到它。
它找出中間值并將其與搜索元素進行比較,如果它大于搜索值,則在搜索的其他部分以相同的方式執行搜索。
你提到的回傳陳述句是再次呼叫函式來重復搜索的功能。即,在串列的第一部分或第二部分執行搜索。
它重復執行此功能,直到找到要搜索的元素。
簡單來說,return 陳述句將控制權收回到函式的開頭。你不能忽略回傳,因為函式被宣告為 int 并且它必須有一個 return 陳述句
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/384993.html
上一篇:無法在遞回java函式中計算總和
