Java 只有2个参数的递归二进制搜索方法

Java 只有2个参数的递归二进制搜索方法,java,recursion,binary-search,Java,Recursion,Binary Search,好的,这是学校作业。我在进行递归二进制搜索时没有遇到任何问题,但是赋值特别指出,该方法应该只接受2个参数、列表和您正在搜索的项。这就是我有点迷路的地方 public int binarySearch(List<Card> cards, Card key) { int mid = (cards.size()) / 2; if(cards.size() == 1) { if(key.equals(cards.get(0))) { r

好的,这是学校作业。我在进行递归二进制搜索时没有遇到任何问题,但是赋值特别指出,该方法应该只接受2个参数、列表和您正在搜索的项。这就是我有点迷路的地方

public int binarySearch(List<Card> cards, Card key)
{
    int mid = (cards.size()) / 2;
    if(cards.size() == 1) {
        if(key.equals(cards.get(0))) {
            return 0;
        }
    }
    else {
        if(key.equals(cards.get(mid))) {
            return mid;
        }
        else if(key.compareTo(cards.get(mid)) == - 1) {
            return binarySearch(cards.subList(0, mid), key);
        }
        else if(key.compareTo(cards.get(mid)) ==  1) {
            return mid + 1 + binarySearch(cards.subList(mid + 1, cards.size()), key);
        }
    }
    return -1;
}
public int-binarySearch(列出卡片、卡片密钥)
{
int mid=(cards.size())/2;
如果(cards.size()==1){
if(key.equals(cards.get(0))){
返回0;
}
}
否则{
if(key.equals(cards.get(mid))){
中途返回;
}
else if(key.compareTo(cards.get(mid))=-1){
返回二进制搜索(cards.subList(0,mid),key);
}
else if(key.compareTo(cards.get(mid))==1){
返回mid+1+binarySearch(cards.subList(mid+1,cards.size()),key);
}
}
返回-1;
}

因此,除非我正在搜索不存在的东西,并且它属于列表的上半部分,否则这将很好地工作。因为我只传递了2个参数,每次递归调用我都要改变列表,但是,如果它在上半部分,我不能失去我的索引点,所以我必须在递归调用中添加这些参数,如果它最终不在上半部分,那么它会返回-1+我之前考虑的所有索引。有没有一种方法可以让我把它全部清理干净,然后让它返回-1?任何建议都将不胜感激

缓存并测试函数调用的结果,如果为-1返回,则为else计算并返回。

在添加索引之前,可以检查该块中递归binarySearch调用的结果是否为-1:

else if(key.compareTo(cards.get(mid)) > 0){
    result = binarySearch(cards.subList(mid + 1, cards.size()), key);
    if (result >= 0) {
        return mid + 1 + result;
    } 
    return -1;
}

您可以使用两种方法,其中一种方法调用另一种方法。public方法公开了家庭作业所需的双参数接口。它还可以检查空参数——这类事情只需要在一开始检查一次


第二个方法是私有的,只从第一个方法内部调用。这是您的标准递归二进制搜索,具有所需的任意多个参数

这是一个让你自己坚持两个论点的好方法,但是你的老师有没有明确地说你不能使用第二个私有的“doIt”方法来接受更多的论点,第一个调用第二个?(也就是说,
返回doBinarySearch(cards,key,0,cards.size())
)另外,请注意,虽然
Card
实现可能总是返回
-1
1
Comparable
只表示它将返回
<0
>0
(或
0
)。您不应该依赖它精确地返回
-1
1
。如果不允许您创建一个按照Mark的建议接受更多参数的委托方法(这是解决此问题的正确方法),那么您可以“聪明”并使用线程局部类变量来存储您自己的开始和结束索引堆栈。你能更新你的代码以反映马克·彼得斯对原始问题(关于compareTo输出的问题)的评论吗?编辑!谢谢你的轻推。:)