【发布时间】:2017-03-10 23:29:28
【问题描述】:
我正在从 C 迁移到 Java,但在递归方面遇到了困难,特别是因为在 Java 中您不能通过引用传递参数。
我正在寻找的不是强制 Java 通过引用传递参数的解决方案/技巧,而是在 Java 中解决此类问题的推荐方法。
让我们在二叉树中递归节点插入:
void nodeInsert(Node n, int a) {
if (n == null)
n = new Node(a);
...
}
在 C 中,在执行结束时,树中的节点 n 将指向新创建的节点。然而,在 Java 中,n 仍然是 null(因为 n 是按值传递的)。
对于此类问题,建议的 Java 方法是什么? 我已经尝试过的一些方法:
- 使用静态对象跟踪父对象(使用泛型时问题变得复杂)。
- 将父节点作为函数的一部分传递。它可以工作,但会使代码有点复杂,看起来不是一个好的解决方案。
- 创建一个指向父节点的附加成员,但这不是一个好的解决方案,因为它增加了 O(n) 所需的空间;
欢迎任何建议。
【问题讨论】:
-
呃,你有没有考虑返回一个节点:
Node nodeInsert(Node n, int a)?或者您是否需要返回任何内容 - 您不能只创建节点并将其添加到insertNode()内的列表或树中吗?为什么你认为你需要一个“输出参数”? -
这种方法确实可行,但它不会超越递归的目标,即解决基本情况(在本例中,当节点为空时)?
-
如果有效,则达到目标。
-
但这适用于这种非常简单的情况,其中只需要返回一个指针。肯定不会在平衡树的实现中起作用。这就是我要求提供最佳实践而不仅仅是解决方案的原因。
-
如果 Node 是一个自定义对象,它已经是一个 ReferenceType ,基本上当你传递 'n' 进行下一次传递时它不应该为空,你可能想再次检查代码,我想说的是对 Node 的引用在 java 中作为值传递,它只是地址
标签: java recursion pass-by-value