好的,这是一个学校作业。我在进行递归二进制搜索时没有遇到任何问题,但是赋值明确指出该方法应该只接受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?任何建议表示赞赏。
答案 0 :(得分:3)
缓存并测试函数调用的结果,如果-1返回,则计算并返回。
答案 1 :(得分:2)
在添加索引之前,您可以检查该块中递归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;
}
答案 2 :(得分:2)
您可以使用两种方法,其中一种方法调用另一种方法。 public方法公开了您的作业所需的两个参数接口。它还可以检查空参数 - 只需要在开始时检查一次的事物。
您的第二种方法是私有的,只能在第一种方法中调用。这是您的标准递归二进制搜索,具有您需要的任意数量的参数。