【问题标题】:Binary Search using recursion java使用递归java进行二分搜索
【发布时间】:2018-07-08 20:09:51
【问题描述】:

我正在尝试编写一种方法,我可以仅使用二进制搜索和递归来找到所需数字的索引。这是我写的方法:

public static int binSearch_r (int[] data, int value, int from, int to)
    {
        if (from <= to)
        {
            int middle = (from+to)/2;
            if (data[middle] > value)
            {
                binSearch_r(data, value, from, middle - 1);
            }
            else if (data[middle] < value)
            {
                binSearch_r(data, value, middle+1, to);
            }
            else
            {
                return middle;
            }
        }
        return -1;
    }

data 是输入的原始数组,value 是我要查找的数字,from 是数组的最左边的索引,to 是数组的最右边的索引。

我测试这个方法的数组只是 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}。但是,当我将值设置为 9、初始“从”设置为 0、初始“至”设置为 array.length-1 时,我收到 -1 而不是所需的索引。这发生在我为值设置的任何数字上。我做错了什么?

【问题讨论】:

  • 您需要在binSearch_r递归调用中添加一个返回。即return binSearch_r(data, value, from, middle - 1);
  • 解决了问题,非常感谢!

标签: java arrays recursion


【解决方案1】:

如果您不熟悉递归,this 是一个很好的资源,可以在 Java 上下文中很好地解释它。

在递归二分搜索中,如果找不到正确的索引,递归方法将减少搜索空间。随着搜索空间的缩小,该方法将调用自身以在这个缩小的空间内查找索引。每个递归调用都期望返回一个值。

public static int binSearch_r (int[] data, int value, int from, int to) {
    if (from <= to) {
        int middle = (from+to)/2;

        if (data[middle] > value) {
            return binSearch_r(data, value, from, middle - 1);
        } else if (data[middle] < value) {
            return binSearch_r(data, value, middle+1, to);
        }
        return middle;            
    }
    return -1;
}

(从评论转移到回答问题)

【讨论】:

    【解决方案2】:
    def bs(array,target_value,i,j):
        # here i is initial postion and j is last position of array 
        mid=(i+j)//2
        if array[mid]==target_value:
            return mid
        if array[mid]>target_value:
             j=mid-1
             return bs(array,target_value,i,j)
             
        if array[mid]<target_value:
            i=mid+1
            return bs(array,target_value,i,j)
    
    
    
    array=[1,2,3,4,5,6,7]
    x=bs(array,7,0,7)
    print(x)
    

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2015-01-21
      • 2014-11-27
      • 2019-03-21
      • 1970-01-01
      相关资源
      最近更新 更多