我一直在嘗試學習演算法,作為其中的一部分,我一直在嘗試撰寫二進制搜索代碼,邏輯似乎很好。代碼不會終止,IDE 永遠保持空閑狀態。我不明白我做錯了什么。任何幫助表示贊賞。提前致謝!
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int no = 5;
System.out.print(binSearch(arr, no, 0, arr.length - 1));
}
private static boolean binSearch(int[] arr, int no, int start, int end) {
while(start <= end) {
int mid = (start end) / 2;
if (arr[mid] == no) {
return true;
} else if (no > arr[mid]) {
binSearch(arr, no, mid 1, end);
} else if(no < arr[mid]) {
binSearch(arr, no, start, mid - 1);
}
}
return false;
}
}
uj5u.com熱心網友回復:
您錯過了return兩個遞回呼叫:
private static bool binSearch(int[] arr, int no, int start, int end) {
while(start <= end) {
int mid = (start end) / 2;
if (arr[mid] == no) {
return true;
} else if (no > arr[mid]) {
return binSearch(arr, no, mid 1, end);
} else if(no < arr[mid]) {
return binSearch(arr, no, start, mid - 1);
}
}
return false;
}
您也可以考慮在非遞回回圈中撰寫它。
uj5u.com熱心網友回復:
好的,所以我想我們回顧一下遞回
binSearch(arr, num, start, end){
while (start<=end){
int mid = (start end)/2;
if (arr[mid] == no) {
return true #when it finally matches return true
}
else if (arr[mid] > no) {
binSearch(arr, no, start, mid-1) #call binSearch for new value
}
}
}
只是為了說明遞回,假設我們想要輸入A 的某個值B。現在想象一個節點或某個點作為代表我們輸入A的原點。對于A之后的每個點或節點,我們采取了一些步驟來找到值B。
一旦我們找到了我們想要的值,我們的方法的結構就可以用一個方向圖來說明。A --> C --> --> D --> B
這基本上就是遞回的作業原理。現在首先,讓我們看一下您的 else if 陳述句。當您的引數滿足 else if 條件之一時,您將呼叫 binSearch 方法。
這樣做基本上是創建一個新的起點,而不是從最初的起點開始。因此,假設在第 3 次迭代中,您最終滿足了布爾條件并且它回傳true。但是它在哪里回傳真實呢?
僅對 binSearch 進行的最后一次呼叫或最近一次呼叫。讓我們稱之為迭代 2。
現在,一旦創建了回傳值,它就會簡單地轉到下一個代碼塊,這會將我們帶到您的 while 回圈中。您的代碼可以移動到下一個代碼塊(回傳 false 值)的唯一方法是跳出 while 回圈,即。讓你的開始值大于你的結束值。
但請記住,我們正在進行迭代 2。并且迭代 2 被賦予了滿足 while 回圈的 start 和 end 值,因此它再次回圈,并且無論 else-if 陳述句迭代 2 在回傳 true 的最終迭代之前登陸,它都會無限重復。
上面提到的顯而易見的解決方案是在呼叫之前放置“return”,因為這將一直回傳到對 binSearch 的原始呼叫。
此外,除非您在沒有遞回的情況下進行,否則不需要 while 回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406610.html
標籤:
上一篇:遞回演算法的解決方案
下一篇:這是什么數學系列,方程式是什么?
