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。我无法向自己解释为什么会发生这种情况。
希望你能帮我。
您可以从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)”