当前位置: 首页 > 知识库问答 >
问题:

除此之外,其他的都会被跳过,但只是有时候

梅跃
2023-03-14
private int bkicalc(int i, List<Integer> history) {

    List<Integer> subList = history.subList(history.size()-1 - i, history.size()-1);
    Set<Integer> uniliste = new HashSet<Integer>(subList);
    
    if (uniliste.size() == 4) {
        if (i>5) {
            System.out.println(i);
        }
        return i;
    } else {
        this.bkicalc(i + 1, history);
    }
    
       System.out.println("else was skipped");
    return 404;

}

您好,这个方法从for循环中被访问1000次,其中1/10次它跳过else并返回404。我无法向自己解释为什么会发生这种情况。

希望你能帮我。

共有1个答案

竺绍辉
2023-03-14

您可以从if分支返回,但不能从else分支返回。因此,诊断和404返回并不表示跳过了else,而是表示已执行。else分支递归与此无关:除非递归调用引发异常,否则该调用最终将返回,此时控制权将直接从else块传递出去。

看起来您可能希望在ore分支中返回递归调用的结果:

private int bkicalc(int i, List<Integer> history) {

    List<Integer> subList = history.subList(history.size()-1 - i, history.size()-1);
    Set<Integer> uniliste = new HashSet<Integer>(subList);
    
    if (uniliste.size() == 4) {
        if (i>5) {
            System.out.println(i);
        }
        return i;
    } else {
        return this.bkicalc(i + 1, history);  // <-- here
    }
    
    assert false : "unreachable";
    return 404;
}

您甚至可能会发现编译器实际上将返回404标记为不可访问。

还要注意,子列表上的边界有点令人惊讶。提供给列表的上限。subList()是排他性的,而不是包容性的,因此您总是忽略历史的最后一个元素。如果这是故意的,那么添加一条代码注释是明智的。

此外,如果history实际上总体上不包含至少4个不同的元素,那么经过一定次数的递归后,该方法将失败,出现IndexOutOfBoundsException。当然,如果它最初不包含至少5个元素(记住一个元素被忽略),那么这种情况肯定会发生。

最后,递归似乎是浪费和不必要的混乱。出于各种原因,迭代方法会更好。(几乎总是如此。)例子:

private int bkicalc(int i, List<Integer> history) {
    if (history.size() >= 5) {
        Set<Integer> uniliste = new HashSet<Integer>(
                history.subList(history.size() - 5, history.size() - 1));
        ListIterator<Integer> iterator = history.listIterator(history.size() - 5);

        while (uniliste.size() < 4 && iterator.hasPrevious()) {
            uniliste.add(iterator.previous());
        }

        if (uniliste.size() == 4) {
            int i = history.size() - 1 - iterator.nextIndex();

            if (i > 5) {
                System.out.println(i);
            }
            return i;
        }
    }

    // Fewer than 4 distinct elements (ignoring the last)
    return -1;
}
 类似资料:
  • 我对此真的很困惑。如果我以编程方式删除Firest集合中的所有文档,集合本身也会被删除: 但是,如果我在线使用Firebase控制台删除所有文档,我并不总是看到集合被删除!我从字面上删除了集合中的所有文档,但它仍然在控制台中。我可以立即在集合中创建另一个文档。但有时集合确实会消失......?! 我读了一些帖子,比如删除Firestore收藏中的所有文件,但没有看到任何解释这一点的内容。 因为一个

  • 问题内容: 我对如何在Java中执行此操作有一般的想法,但是我正在学习Python,但不确定如何执行。 我需要实现一个函数,该函数返回一个包含列表中所有其他元素的列表,从第一个元素开始。 到目前为止,我不确定从这里开始该怎么做,因为我只是在学习Python中的for循环是如何不同的: 问题答案:

  • 问题内容: 我想在后端计算地理围栏违规和行车距离计算。这是我第一次使用google API。我在网上发现的所有内容都是针对Android的。是否有特定于常规计算的API。 问题答案: 您可以自己实现它,而无需使用任何框架,这非常容易… 我假设您要检查您是否在圆形地理围栏内。 为此,只需计算圆心与您的位置之间的距离(经度,纬度)。如果距离小于圆半径,则说明您在地理围栏内,否则就在地理围栏外。 像这样

  • 有没有可能通过JSONPath知道其他“路径”的存在? 我所说的现有“路径”是指类似于此JSON的“a.b.c”或“a.b.d”形式的字符串: 可以写一个JSONPath来判断除了a. b. c和a. b. d之外是否还有其他“路径”吗? 例如,在下面的JSON中,它应该发现有属性'e':

  • 我正在尝试为一项大学工作开发一些代码,我有一个算法,可以为我提供图形中两个节点之间的最短路径。请注意,节点是有资本的国家。 有谁能解释一下,我怎样才能开发出一条从A国到B国的最短路径,通过一系列的首都(国家)吗? 我已经实现了一种方法,该方法还提供了两个地理点之间的距离。 我最初的想法是,根据首都到A国的距离排列首都列表,然后将A国到列表第一个国家、列表第一个国家和列表第三个国家之间最短路径的所有

  • 问题内容: 为什么没有人提及嵌套循环联接? 问题答案: 如果希望/可以读取未提交的记录,则在联接上使用(NOLOCK)可能会提高性能。 什么时候应该使用“with(nolock)”