Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 尝试在T数组中使用二进制搜索方法递归查找数字时获取StackOverflowerError_Java_Arrays_Recursion_Stack Overflow_Binary Search - Fatal编程技术网

Java 尝试在T数组中使用二进制搜索方法递归查找数字时获取StackOverflowerError

Java 尝试在T数组中使用二进制搜索方法递归查找数字时获取StackOverflowerError,java,arrays,recursion,stack-overflow,binary-search,Java,Arrays,Recursion,Stack Overflow,Binary Search,嘿,我用二进制搜索方法在数组中找到一个数字,在寻找中间的一个数时,我得到了一个堆栈溢出错误。 这是我的密码: public static <T extends Comparable< ? super T>> int find(T [] a, T x, int low, int high){ if(low>high) throw new IllegalArgumentException(); int tmp = (high-l

嘿,我用二进制搜索方法在数组中找到一个数字,在寻找中间的一个数时,我得到了一个堆栈溢出错误。

这是我的密码:

public static  <T extends Comparable< ? super T>>
    int find(T [] a, T x, int low, int high){
    if(low>high)
        throw new IllegalArgumentException();
    int tmp = (high-low)/2;

    if(a[tmp].compareTo(x)==0)
        return tmp;
    else if(a[tmp].compareTo(x)>0)
        find(a,x,tmp,high);
    else if(a[tmp].compareTo(x)<0)
        find(a,x,low,tmp);
    return -1;
}
公共静态>
int find(T[]a,tx,int low,int high){
如果(低>高)
抛出新的IllegalArgumentException();
int tmp=(高-低)/2;
如果(a[tmp]。与(x)==0比较
返回tmp;
else如果(a[tmp]。与(x)>0比较)
查找(a、x、tmp、高);
否则如果(a[tmp]。与(x)相比,这就是问题所在:

if(a[tmp].compareTo(x)>0)
    find(a,x,tmp,high);
else if(a[tmp].compareTo(x)<0)
    find(a,x,low,tmp);
这就是问题所在:

if(a[tmp].compareTo(x)>0)
    find(a,x,tmp,high);
else if(a[tmp].compareTo(x)<0)
    find(a,x,low,tmp);
你需要:

else if(a[tmp].compareTo(x)>0)
    find(a,x,tmp - 1,high);
else if(a[tmp].compareTo(x)<0)
    find(a,x,low,tmp + 1);
else如果(a[tmp].比较(x)>0)
发现(a,x,tmp-1,高);
如果(a[tmp]),则与(x)相比,您需要:

else if(a[tmp].compareTo(x)>0)
    find(a,x,tmp - 1,high);
else if(a[tmp].compareTo(x)<0)
    find(a,x,low,tmp + 1);
else如果(a[tmp].比较(x)>0)
发现(a,x,tmp-1,高);
else if(a[tmp]。与(x)
public static>
int find(T[]a,tx,int low,int high){
如果(低>高)
抛出新的IllegalArgumentException();
int tmp=(高+低)/2;//将-替换为+表示平均值
如果(a[tmp]。与(x)==0比较
返回tmp;
else如果(a[tmp]。与(x)>0比较)
返回find(a,x,tmp,high);//返回找到的索引
else if(a[tmp]。与(x)
public static>
int find(T[]a,tx,int low,int high){
如果(低>高)
抛出新的IllegalArgumentException();
int tmp=(高+低)/2;//将-替换为+表示平均值
如果(a[tmp]。与(x)==0比较
返回tmp;
else如果(a[tmp]。与(x)>0比较)
返回find(a,x,tmp,high);//返回找到的索引


否则如果(a[tmp].compareTo(x)StackOverflow…这是正确的位置。抱歉,无法传递应用程序的讽刺。@chr-lol…我在写它的时候自己就想到了这一点,这是巧合,不是讽刺;)讽刺的是,如果他写了一些检测stackoverflow的代码,但这些代码最终导致了他的代码中的stackoverflow。多么讽刺的是:巧合被误认为是讽刺。stackoverflow…这是正确的地方。抱歉,无法传递应用程序的讽刺。@chr-lol…我自己在写的时候就考虑过了。这是巧合,不是讽刺;)讽刺的是,如果他写了一些检测stackoverflow的代码,但这些代码最终导致了他的代码中的stackoverflow。多么讽刺的是:巧合被误认为是讽刺。我也是这么想的,但后来我得到了一个IllegalArgumentException@fgualda87:请考虑在什么情况下返回-1…将进行编辑。嗯,当我试图查找的元素x不在数组中,所有其他时间它都应该返回元素x所在的索引at@fgualda87:否,当前代码不会返回-1。请尝试找出任何代码路径(其中compareTo是稳定的)这样它就不需要任何一个
if
分支。请参阅我的编辑。@fualda87:现在是应用一些诊断和调试技能的好时机。一步一步地进行,确定您希望它做什么,等等。(事实上,我已经在我的答案中发现并修复了这个问题——我在你的原始代码中复制了一些糟糕的逻辑。但是,看看你是否可以在没有这些的情况下解决这个问题……)我也是这么想的,但后来我得到了一个IllegalArgumentException@fgualda87:考虑一下在什么情况下返回-1…将进行编辑。嗯,当我试图查找的元素x不在数组中时,它将返回-1,所有其他时间它都应返回元素x所在的索引at@fgualda87:不,您当前的代码不会重新生成rn-1.尝试找出任何代码路径(其中compareTo是稳定的),这样它就不会出现
if
分支之一。请参阅我的编辑。@fualda87:现在是应用一些诊断和调试技能的好时机。一步一步地进行,找出您希望它做的事情,等等。(我已经在我的答案中发现并修复了这个问题-我在你的原始代码中复制了一些不好的逻辑。但是看看你是否可以在没有这些的情况下解决它…)我认为在这种情况下抛出一个异常是合理的-如果该方法是公共的。但是,在比较之后可以检测到“不匹配”选项(参见我的答案)或者可能有一个没有高/低部分的公共方法,以及一个适当返回-1的私有实现。我认为在这种情况下抛出异常是合理的-如果该方法是公共的。但是,在比较之后可以检测到“不匹配”选项(见我的答案)或者有一个没有高/低部分的公共方法,以及一个适当返回-1的私有实现。你在+符号上是对的。谢谢!我想从0到100,如果我想从250到270,平均值是260,而使用-符号会给我10。谢谢!你在+符号上是对的。谢谢!我想我从0到100,如果我想从250到270,平均值是260,而有-符号会给我10。谢谢!