Java 如何修复此StackOverflower错误?

Java 如何修复此StackOverflower错误?,java,recursion,Java,Recursion,背景: 该代码旨在使用递归二进制搜索算法循环遍历带有名称和数字的PhoneBookEntries的ArrayList 我想我的搜索方法得到了无限递归。我复制了代码。我很困惑:据我所知,每次都应该将数组分成两半并再次搜索,直到找到搜索项为止,但该方法似乎没有正确终止。有什么建议吗 编辑:我已经按照下面的评论修改了代码,但仍然不起作用 import java.util.ArrayList; public class BinarySearcher { private ArrayList&

背景: 该代码旨在使用递归二进制搜索算法循环遍历带有名称和数字的PhoneBookEntries的ArrayList

我想我的搜索方法得到了无限递归。我复制了代码。我很困惑:据我所知,每次都应该将数组分成两半并再次搜索,直到找到搜索项为止,但该方法似乎没有正确终止。有什么建议吗

编辑:我已经按照下面的评论修改了代码,但仍然不起作用

import java.util.ArrayList;


public class BinarySearcher {

    private ArrayList<PhoneBookEntry> entries;

    public BinarySearcher(ArrayList<PhoneBookEntry> entries)
    {
        this.entries = entries;
    }

    public int search(String find, int low, int high){

        int mid = (low + high) / 2;

        if(entries.get(mid).getName().compareTo(find) == 0){
            return mid;
        }

        if(entries.get(mid).getName().compareTo(find) < 0){
            return search(find, mid+1, high);
        }
        else if(entries.get(mid).getName().compareTo(find) > 0){
            return search(find, low, mid-1);
        }

        return -1;
    }
}

从一个不变的外部值初始化每个低、高和中递归。所以它们实际上并没有变小


pLow和pHigh从未使用过,但它们是您在上一个递归中刚刚使用的新值。

您的函数从未使用这些pLow和pHigh参数,因此它始终具有low=0和high=entries.size-1。您的函数应该只使用其参数,并且这两个初始化必须在第一次调用search的外部进行

说:


您使用列表本身的最小和最大索引递归调用它,而不是基于传递给该方法的参数来调用新参数

public int search(String find, int pLow, int pHigh){
    // int low = 0; dont need, just use pLow
    // int high = entries.size() - 1; use pHigh instead
    int mid = (pLow + pHigh) / 2;

    if(entries.get(mid).getName().compareTo(find) == 0){
        return mid;
    }

    if(entries.get(mid).getName().compareTo(find) < 0){
        return search(find, mid+1, pHigh);
    }
    else if(entries.get(mid).getName().compareTo(find) > 0){
        return search(find, pLow, mid-1);
    }
    return -1;
}

堆垛机溢出?您找到了正确的位置:太阳镜:为什么不创建一个包含10个或更少项的数组并对其进行调试?在哪里使用传递给搜索的参数?int mid=low+high/2;可能应该是int mid=pLow+pHigh/2;。似乎你从多个来源复制/粘贴。摆脱低和高,改用plow和phigh。比我快,但是这个。你应该在检查中把这些初始值作为参数传递,而不是在方法中传递。有趣的是,我在发布这篇文章后就尝试了,因为我意识到了我的错误,但它仍然不起作用。我糊涂了,我试过了,但什么都没有。我不明白;这应该是有效的@user3349460机器在这样简单的情况下通常不会有那么大的错误。试试devnull建议的一个小测试场景,以检查mid是否正确设置,但这解决了您遇到的一个大问题。
public int search(String find, int pLow, int pHigh){
    // int low = 0; dont need, just use pLow
    // int high = entries.size() - 1; use pHigh instead
    int mid = (pLow + pHigh) / 2;

    if(entries.get(mid).getName().compareTo(find) == 0){
        return mid;
    }

    if(entries.get(mid).getName().compareTo(find) < 0){
        return search(find, mid+1, pHigh);
    }
    else if(entries.get(mid).getName().compareTo(find) > 0){
        return search(find, pLow, mid-1);
    }
    return -1;
}