【问题标题】:Recursive binary search method having only 2 arguments只有 2 个参数的递归二进制搜索方法
【发布时间】: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 实现可能总是返回-11Comparable 只说它会返回&lt; 0&gt; 0(或0 )。您不应该完全依赖它返回 -11
  • 如果不允许像 Mark 建议的那样创建一个接受更多参数的委托方法(这是解决此问题的正确方法),那么您可以“聪明”并使用线程本地类变量来存储您自己的开始和结束索引堆栈。

标签: java recursion binary-search


【解决方案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;
    }
    

    【讨论】:

    • 您好 Mongiesama,欢迎来到 StackOverflow 并感谢您提供的答案。您能否更新您的代码以反映 Mark Peters 对原始问题(关于 compareTo 输出的问题)的评论?
    • 已编辑!谢谢你的推动。 :)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2021-03-30
      • 2021-04-28
      • 1970-01-01
      • 2019-09-01
      相关资源
      最近更新 更多