【发布时间】:2012-01-13 15:00:57
【问题描述】:
好的,这是学校作业。我在进行递归二分搜索时没有遇到任何问题,但作业明确指出该方法只应采用 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?任何建议表示赞赏。
【问题讨论】:
-
这是一个让自己坚持两个论点的好方法,但是你的老师有没有特别说你不能使用第二个私有“doIt”方法来接受更多参数,第一个调用第二个? (即
return doBinarySearch(cards, key, 0, cards.size()))另外,请注意,虽然您的Card实现可能总是返回-1或1,Comparable只说它会返回< 0或> 0(或0)。您不应该完全依赖它返回-1或1。 -
如果不允许像 Mark 建议的那样创建一个接受更多参数的委托方法(这是解决此问题的正确方法),那么您可以“聪明”并使用线程本地类变量来存储您自己的开始和结束索引堆栈。
标签: java recursion binary-search