有人可以向我解释我的代码有什么问题。它假设遍历整个树并返回最接近查询点的点。
public Point2D nearest(Point2D point) {
Point2D nearest;
if (root == null) {
return null;
}
nearest = nearest(root, point, root.point);
return nearest;
}
private Point2D nearest(Node node, Point2D point, Point2D candidate) {
if (node == null) {
return candidate;
}
if (point.distanceTo(node.point) < point.distanceTo(candidate)) {
candidate = node.point;
}
nearest(node.leftBottom, point, candidate);
nearest(node.rightTop, point, candidate);
return candidate;
}
答案 0 :(得分:0)
...仍然有点模糊的递归
听起来更像是局部变量有点模糊。
调用函数时,Java会将激活记录(AR)推送到调用堆栈。 AR包含所有函数args和局部变量。
当一个函数返回时,它的AR会从堆栈弹出并被丢弃,并且它的所有args和locals都会消失。
每次通话都会获得拥有的 AR。因此,对nearest(...)
的每次递归调用都会获取其自己的 candidate
变量。当您的代码调用nearest(...,candidate)
时,新的激活会更改其 candidate
变量,但这对调用者的candidate
没有影响。当内部调用返回时,内部激活中的candidate
被抛弃。这就是Jon Skeet在谈到“价值传递的论点”时的意思。
您只能将 in 中的参数传递给函数。要重新获得回报,您必须使用返回值,否则您必须将 in 传递给函数可以修改的某个对象。