如果,否则,则返回语句,否则,否则语句不起作用

时间:2018-07-11 04:29:44

标签: java

我偶然发现了代码中的某个问题,据说返回会停止我的方法,但就我而言并非如此。我试图制作一个名为“ 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设置的值。因此,为了澄清起见,我在else语句上添加了一些文本以确保其执行并返回middleIndex,然后该文本显示出来,因此基本上我的循环进入了else语句并希望返回middleIndex,但没有。也许递归与此有关,但我不知道也许你们可以帮助我。

5 个答案:

答案 0 :(得分:1)

由于方法的签名为public int binarySearch,因此,您应该从binarySearch方法的递归调用中返回int。您不应该真正return 0正确实施此方法。

答案 1 :(得分: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及其实现的更多信息,请点击this链接

答案 2 :(得分:0)

以下是二进制搜索的迭代Java代码,您的代码有些缺陷。

            mDatabase.child(id).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                  String eventTime = dataSnapshot.child("timeStamp").getValue().toString();
                                                if(Integer.parseInt(nowTime) > Integer.parseInt(eventTime)){
                                                    Intent intent = new Intent(PrincipalActivity.this, TestingActivity.class);
                                                    intent.putExtra("eventKey", id);
                                                    startActivity(intent);
                                                    finish();
                                                } else {
                                                    Intent intent = new Intent(PrincipalActivity.this, EventSingleActivity.class);
                                                    intent.putExtra("eventKey", id);
                                                    startActivity(intent);
                                                }

                                }
                            });
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

答案 3 :(得分:0)

 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!");  
   }  

您也可以通过递归来实现。

答案 4 :(得分:0)

您的代码中有一些小错误。

在递归中,当函数递归调用自身时,应将函数调用放在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)

= return(binarySearch(3,7,arr,val))

= return(返回(binarySearch(5,7,arr,val)))

= return(return(return 6))//这里6是else块中返回的middleValue

=返回(返回6)

=返回6

由于您没有在代码中添加return语句,因此递归堆栈中最顶层的函数调用返回0。