Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归二进制搜索——Java_Java_Binary Search - Fatal编程技术网

递归二进制搜索——Java

递归二进制搜索——Java,java,binary-search,Java,Binary Search,我在网上进行了广泛的搜索,但我找到的所有解决方案都使用两个参数来跟踪所使用区域的大小。如果允许我这么做,这会很容易,但我不是。正如您在下面看到的,代码缺少停止值,因为我不知道如何保留原始信息 这是Wikipedia上的代码,您可以看到他们使用imin和imax作为跟踪变量: 下面是我非常不正确的代码。mid变量没有任何意义,因为如果函数中不允许有任何额外的参数,我不知道如何正确设置low和high public static int findRecursiveB( String s, char

我在网上进行了广泛的搜索,但我找到的所有解决方案都使用两个参数来跟踪所使用区域的大小。如果允许我这么做,这会很容易,但我不是。正如您在下面看到的,代码缺少停止值,因为我不知道如何保留原始信息

这是Wikipedia上的代码,您可以看到他们使用imin和imax作为跟踪变量:

下面是我非常不正确的代码。mid变量没有任何意义,因为如果函数中不允许有任何额外的参数,我不知道如何正确设置low和high

public static int findRecursiveB( String s, char c)
{
    int low = 0;             
    int high = s.length()-1;
    int mid = (low+high)/2; 

    if (s.charAt(mid) < c) {
        return findRecursiveB(s.substring(low, mid), c);
    }
    else if (s.charAt(mid) >= c) {
        return findRecursiveB(s.substring(mid+1, high), c);
    }
    else return mid;

}

这里的一个关键点是原始字符串s包含什么?要使其工作,它必须是已排序的字符串,这意味着字符串中的字符必须按顺序排列。具体地说,看起来您编写的代码期望s按相反顺序排序。否则,除非我完全遗漏了什么,否则您的代码完全按照它应该做的:不需要传递额外的参数,因为您在每次递归调用中都传递子字符串


否则,做得很好。

可能重复或类似的问题,您是否可以创建帮助器方法?为什么不允许创建帮助器方法?难道你不能对一个私有方法调用一个函数,然后用这种方式形成你的递归逻辑吗?不幸的是,我的CS教授创建的环境非常僵硬。我只需要处理这个函数。如果您将子字符串传递给递归调用,结果将是子字符串中的位置,因此您必须将子字符串的偏移量添加到该位置。此外,将highto设置为s.length-1而不是length意味着您在每个递归的末尾都要删除一个字符。你应该考虑一下,如果搜索字符根本不包含,例如,子字符串变为空…对不起,我忘了澄清:s是按字母顺序倒序的。但是,由于某种原因,我的测试似乎不起作用。例如,递归bhgfedcba,“b”产生索引越界错误。以下是错误:如另一个答案所示,将大于或等于号改为大于号。