【问题标题】:Why is return executed twice为什么 return 执行两次
【发布时间】:2018-09-07 03:53:25
【问题描述】:

在这种情况下,值确实匹配并且布尔值设置为 true,但是 return 被调用两次并将值更新为 false。谁能建议我在这里缺少什么?

public class BinSearch {

    public static void main(String[] args) {

        BinSearch bin=new BinSearch();
        int arr[]= {2,4,6,8,10,12,14,16};
        boolean b=bin.binSearch(arr,0,arr.length-1,12);
        System.out.println("Number found "+b);

    }

    public  boolean binSearch(int arr[],int low,int high,int val)
    {
        int mid=(low+high)/2;

        if(arr[mid]==val)
        {
            return true;
        }

        else if(arr[mid]>val)
        {
            binSearch(arr,mid+1,high,val);
        }

        else  
        {
            binSearch(arr,low+1,mid,val);
        }

        return false;
    }
}

【问题讨论】:

    标签: java recursion binary-search


    【解决方案1】:

    你在调用递归时缺少两个返回:

    return binSearch(...);
    

    如果你不写它们,该方法将忽略递归的结果,只在最后返回false。之后,最后一个return 将是不必要的,应该删除。最后需要检查low > high时的大小写,表示没有找到该元素。

    【讨论】:

      【解决方案2】:

      因为您的return false; 会覆盖所有内容,除非在第一次运行时找到该值并且没有调用递归调用。请为每个递归调用返回。此外,您必须检查您的低边界是否小于或等于高边界。因此,您的代码可能如下:

      public boolean binSearch(int arr[],int low,int high,int val)
      {
          if (low <= high) {
             int mid=(low+high)/2;
             if(arr[mid]==val) {
                return true;
             } else if(arr[mid]>val) {
                return binSearch(arr,mid+1,high,val);
             } else {
                return binSearch(arr,low+1,mid,val);
             }
          }
          return false;
      }
      

      【讨论】:

        【解决方案3】:

        您也可以在binSearch 函数中尝试以下代码。唯一的改变是有一个布尔类型变量捕获递归调用中返回的值并最终返回这个变量。

        public  boolean binSearch(int arr[],int low,int high,int val) {
            int mid=(low+high)/2;
            boolean returnValue = false;
        
            if(arr[mid]==val) {
                return true;
            } else if(arr[mid]>val) {
                returnValue  = binSearch(arr,mid+1,high,val);
            } else {
                returnValue  = binSearch(arr,low+1,mid,val);
            }    
            return returnValue;
        }
        

        【讨论】:

          【解决方案4】:
          public class BinSearch {
          
              public static void main(String[] args) {
          
                  BinSearch bin=new BinSearch();
                  int arr[]= {2,4,6,8,10,12,14,16};
                  boolean b=bin.binSearch(arr,0,arr.length-1,16);
                  System.out.println("Number found "+b);
          
              }
          
              public  boolean binSearch(int arr[],int low,int high,int val)
              {
                  int mid=(low+high)/2;
                  //boolean b = false;
                  while(low<=high)
                  {
                      if(arr[mid]==val)
                      {
                          return true;
                      }
          
                      else if(val>arr[mid])
                      {
                          return binSearch(arr,mid+1,high,val);
                      }
          
                      else  
                      {
                          return binSearch(arr,low+1,mid,val);
                      }
          
                  }
          
                  return false;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2016-10-07
            • 2019-10-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-05
            • 1970-01-01
            相关资源
            最近更新 更多