只有2个参数的递归二分搜索方法



这是学校的作业。我在做递归二进制搜索时没有遇到任何问题,但赋值说明该方法应该只接受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;
}

所以这将工作得很好,除非我正在搜索的东西不存在,它属于上半部分的列表。因为我只传递了2个参数,我必须在每次递归调用时改变列表,然而,如果它在上半部分,我不能失去我的索引位置,所以我必须在递归调用时把它们加到那里,如果它最终不在上半部分那么它返回-1 +我之前考虑的所有索引。有没有一种方法可以把它全部清除,让它只返回-1?任何建议都很感激。

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

您可以使用两个方法,其中一个调用另一个。公共方法公开了您的作业需要的两个参数接口。它还可以检查空参数——这种东西只需要检查一次,就在开始的时候。

第二个方法是私有的,只能从第一个方法内部调用。这就是标准的递归二分搜索,你需要多少参数就有多少。

在添加索引之前,您可以检查该块中的递归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;
}

最新更新