Java 通过递归调用保持变量值的存储
我有下面的contains方法来检查一个字在基数trie数据结构中是否可用。为了找到我在这里使用的单词,方法Java 通过递归调用保持变量值的存储,java,recursion,Java,Recursion,我有下面的contains方法来检查一个字在基数trie数据结构中是否可用。为了找到我在这里使用的单词,方法的recursiv调用包含。但是我在这个过程中遇到了一个问题,即当发现布尔变量available时,将其存储为true,因为当我向上移动变量的值时,beavailable被更改为false 如果将变量赋值为true一次,如何保持该变量中的true值可用 代码: private boolean contains(TrieNode node, String s) { boolean a
的recursiv调用包含。但是我在这个过程中遇到了一个问题,即当发现布尔变量available
时,将其存储为true
,因为当我向上移动变量的值时,beavailable
被更改为false
如果将变量赋值为true一次,如何保持该变量中的true值可用
代码:
private boolean contains(TrieNode node, String s) {
boolean available = false;
String communsubString = checkEdgeString(node.getNext(), s);
String restString = s.substring(communsubString.length());
if (node.getNext() != null && !node.getNext().isEmpty()) {
for (TrieNode nextNodeEdge : node.getNext()) {
if (nextNodeEdge.getEdge().equals(communsubString)) {
if (!restString.isEmpty()) {
contains(nextNodeEdge, restString);
} else {
// I want to keep the true value if I was here once.
available = true;
}
}
}
}
return available;
}
您可以使用调用contains
的结果或当前可用的值
:
available |= contains(nextNodeEdge, restString);
然后,您可能会执行某种快速中断以更快地返回,因此您不必继续检查其他节点,因为它们永远不会使值为假:
if (!restString.isEmpty()) {
available |= contains(nextNodeEdge, restString);
} else {
// I want to keep the true value if I was here once.
available = true;
}
if (available) break;
或者,更简洁地说:
if (restString.isEmpty() || contains(nextNodeEdge, restString)) {
return true;
}
一旦你发现了什么,你就可以一路返回真值:
private boolean contains(TrieNode node, String s) {
String communsubString = checkEdgeString(node.getNext(), s);
String restString = s.substring(communsubString.length());
if (node.getNext() != null && !node.getNext().isEmpty()) {
for (TrieNode nextNodeEdge : node.getNext()) {
if (nextNodeEdge.getEdge().equals(communsubString)) {
if (!restString.isEmpty()) {
if ( contains(nextNodeEdge, restString) ) {
return true;
}
} else {
return true;
}
}
}
}
return false;
}
从返回布尔值的递归方法判断,为什么首先存储可用的?为什么不简单地返回值,如下所示:
private boolean contains(TrieNode node, String s) {
var available = false;
String communsubString = checkEdgeString(node.getNext(), s);
String restString = s.substring(communsubString.length());
if (node.getNext() != null && !node.getNext().isEmpty()) {
for (TrieNode nextNodeEdge : node.getNext()) {
if (nextNodeEdge.getEdge().equals(communsubString)) {
if (!restString.isEmpty()) {
available = contains(nextNodeEdge, restString);
} else {
return true; // Simply return the value
}
}
}
}
return available;
}
既然一旦它为真,您就不打算将其改回false,为什么不简单地返回true
?只在方法调用本身中传递值,而不在内部声明,将默认值设为false
为什么不干脆returntrue
而不是available=true
?您将丢弃递归调用的返回值。另外,如果在for循环中设置为true,则可以中断。