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