[英]Return statement inside if, else if, else statement is not working
我偶然發現了代碼中的某個問題,據說返回會停止我的方法,但就我而言並非如此。 我試圖制作一個叫做“ binarySearch”的方法,據說該方法可以完成它的工作。
public int binarySearch(int lowIndex, int highIndex, int[] arr, int val) {
int middleIndex = (lowIndex + highIndex ) / 2;
if(arr[middleIndex] < val) {
lowIndex = middleIndex;
} else if (arr[middleIndex] > val) {
highIndex = middleIndex;
} else {
return middleIndex;
}
binarySearch(lowIndex, highIndex, arr, val);
return 0;
}
問題是如果我已經找到搜索值所在的索引,則else語句將返回該索引並已停止。 但是相反,我總是得到“ 0”,這是我認為我為默認返回值設置的值return 0
。 因此,為了澄清middleIndex
,我在else語句上添加了一些文本以確保其執行並返回middleIndex
,然后出現該文本,因此基本上我的循環進入了else語句,並希望返回middleIndex
但未返回。 也許遞歸與此有關,但我不知道也許你們可以幫助我。
由於方法的簽名為public int binarySearch
,這意味着您應該從binarySearch
方法的遞歸調用中返回int。 在此方法的正確實現中,您不應該真正return 0
。
您必須返回遞歸的結果。 您可以參考下面顯示的代碼以了解您在做什么錯。
// Returns index of x if it is present in arr[l..
// r], else return -1
int binarySearch(int arr[], int l, int r, int x)
{
if (r>=l)
{
int mid = l + (r - l)/2;
// If the element is present at the
// middle itself
if (arr[mid] == x)
return mid;
// If element is smaller than mid, then
// it can only be present in left subarray
if (arr[mid] > x)
return binarySearch(arr, l, mid-1, x);
// Else the element can only be present
// in right subarray
return binarySearch(arr, mid+1, r, x);
}
// We reach here when element is not present
// in array
return -1;
}
有關BinarySearch及其實現的更多信息,您可以點擊此鏈接
這是二進制搜索的迭代Java代碼,您的代碼有些瑕疵。
int binarySearch(int arr[], int x) {
int l = 0, r = arr.length - 1;
while (l <= r) {
int m = l + (r-l)/2;
if (arr[m] == x)
return m;
if (arr[m] < x)
l = m + 1;
else
r = m - 1;
}
return -1;
}
public static void binarySearch(int arr[], int first, int last, int key){
int mid = (first + last)/2;
while( first <= last ){
if ( arr[mid] < key ){
first = mid + 1;
}else if ( arr[mid] == key ){
System.out.println("Element is found at index: " + mid);
break;
}else{
last = mid - 1;
}
mid = (first + last)/2;
}
if ( first > last ){
System.out.println("Element is not found!");
}
您也可以通過遞歸來實現。
您的代碼中有一些小錯誤。
在遞歸中,當函數遞歸調用自身時,應將函數調用放在return語句中。 這樣可以確保將遞歸函數調用的結果返回給調用函數。
這是修改后的代碼-
class BinarySearch
{
// Returns index of x if it is present in arr[l..
// r], else return 0
public int binarySearch(int lowIndex, int highIndex, int[] arr, int val)
{
if(highIndex>=lowIndex) //this line should be added for safety
{
int middleIndex = (lowIndex + highIndex ) / 2;
if(arr[middleIndex] < val)
{
lowIndex = middleIndex;
}
else if (arr[middleIndex] > val)
{
highIndex = middleIndex;
}
else
{
return middleIndex;
}
return binarySearch(lowIndex, highIndex, arr, val); //this should be the return statement
}
return 0;
}
// Driver method to test above
public static void main(String args[])
{
BinarySearch ob = new BinarySearch();
int arr[] = {1,2,3,4,5,6,7,8};
int n = arr.length;
int x = 7;
int result = ob.binarySearch(0,n-1,arr,x);
if (result == 0)
System.out.println("Element not present");
else
System.out.println("Element found at index " + result);
}
}
此代碼可以正常工作。
上面代碼的遞歸堆棧說明-
的binarySearch(0,7,ARR,val)的
=返回(binarySearch(3,7,arr,val))
= return(返回(binarySearch(5,7,arr,val)))
= return(return(return 6))//這里6是else塊中返回的middleValue
=返回(返回6)
=返回6
因為您沒有在代碼中添加return語句,所以遞歸堆棧中最頂層的函數調用返回0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.