Java 通过递归调用保持变量值的存储

Java 通过递归调用保持变量值的存储,java,recursion,Java,Recursion,我有下面的contains方法来检查一个字在基数trie数据结构中是否可用。为了找到我在这里使用的单词,方法的recursiv调用包含。但是我在这个过程中遇到了一个问题,即当发现布尔变量available时,将其存储为true,因为当我向上移动变量的值时,beavailable被更改为false 如果将变量赋值为true一次,如何保持该变量中的true值可用 代码: private boolean contains(TrieNode node, String s) { boolean a

我有下面的contains方法来检查一个字在基数trie数据结构中是否可用。为了找到我在这里使用的单词,方法
的recursiv调用包含
。但是我在这个过程中遇到了一个问题,即当发现布尔变量
available
时,将其存储为
true
,因为当我向上移动变量的值时,be
available
被更改为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,则可以
中断