gpt4 book ai didi

java - 无法在递归调用中设置引用变量

转载 作者:行者123 更新时间:2023-11-30 09:02:34 27 4
gpt4 key购买 nike

我正在使用递归方法使用键在二叉树中查找节点。当我找到节点时,我将它设置为我的引用变量 foundNode 并返回。问题是,当我读取对象时,它的值仍然是 null。有人可以帮忙吗?

findGivenNode(root, key, foundNode, parentStack);

private boolean findGivenNode(Node node, int key, Node foundNode, Stack<Node> parentStack) {
if (node == null) {
return false;
}

parentStack.add(node);
if (node.getData() == key) {
foundNode = node;
return true;
}
boolean leftReturn = findGivenNode(node.getLeftChild(), key, foundNode, parentStack);
boolean RightReturn = findGivenNode(node.getRightChild(), key, foundNode, parentStack);
if (leftReturn || RightReturn) {
return true;
} else {
parentStack.pop();
return false;
}
}

最佳答案

Java 不按引用传递参数,它们按值传递。 Read more here

让我们通过一个例子来说明。将您要查找的键设为值为 21 的整数。函数开头的情况是这样的:

initial_state

所以现在,当你说:

foundNode = node; // this doesn't reflect outside of the method

您正在 findGivenNode() 方法内部本地更改 foundNode 的值,它不适用于此方法之外。基本上,名为 foundNode 的局部变量引用您要更改的节点,然后您通过上面的语句使此局部变量 foundNode 引用新节点。此更改仅反射(reflect)在函数内部。一旦您的函数完成,局部变量就不再存在,因此 foundNode 的本地版本也不存在。视觉效果:

wrong_move

简单的解决方案是使用 Wrapper function

要跟踪引用,您可以创建一个简单的包装类来存储您想要的引用:

private class NodeWrapper {
Node foundNode;
NodeWrapper() {
foundNode = null;
}
}

然后您可以创建一个新的 NodeWrapper 并将其传递给您的函数而不是 foundNode

NodeWrapper wrapper = new NodeWrapper();
findGivenNode(root, wrapper, key, parentStack);

然后在你的函数中而不是:

foundNode = node;

你说:

wrapper.foundNode = node;

这样您就可以在 NodeWrapper 中的整个递归过程中维护引用。含义:

NodeWrapper wrapper = new NodeWrapper();
findGivenNode(root, wrapper, key, parentStack);
// at this point, wrapper.foundNode will hold the reference to the node you need
// or null if the node wasn't found

另一方面,在方法之上你有这个函数原型(prototype):

findGivenNode(root, key, foundNode, parentStack);

好像有人还在用C/C++ :)

这在Java中是不必要的,你可以阅读this question thread了解其背后的原因或只是谷歌它。

关于java - 无法在递归调用中设置引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25926870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com