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