簡體   English   中英

如果,否則,如果else語句不起作用,則在內部返回語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM