如何使用静态变量编写递归函数

时间:2012-03-19 09:03:33

标签: java

我正在尝试编写一个代码来获取从(0,0)开始的猴子可以访问的点集(x,y),这样每个点都满足| x | + | y | < _limitSum。我编写了下面的代码,并使用了Coordinate类型的成员的静态HashSet(此处未显示),并编写了一个递归方法AccessPositiveQuadrantCoordinates。但问题是通过递归调用传递的HashSet成员不会反映先前调用中添加的Coordinate成员。任何人都可以帮助我如何传递对象引用来实现这一点吗?还有其他方法可以解决这个问题吗?

public class MonkeyCoordinates {
public static HashSet<Coordinate> _accessibleCoordinates = null;
private int _limitSum;
public MonkeyCoordinates(int limitSum) {
    _limitSum = limitSum;
    if (_accessibleCoordinates == null)
        _accessibleCoordinates = new HashSet<Coordinate>();
}
public int GetAccessibleCoordinateCount() {
    _accessibleCoordinates.clear();
    Coordinate start = new Coordinate(0,0);
    AccessPositiveQuadrantCoordinates(start);
    return (_accessibleCoordinates.size() * 4);
}
private void AccessPositiveQuadrantCoordinates(Coordinate current) {
    if (current.getCoordinateSum() > _limitSum) { return; }
    System.out.println("debug: The set _accessibleCoordinates is ");
    for (Coordinate c : _accessibleCoordinates) {
        System.out.println("debug:" + c.getXValue() + " " + c.getYValue());
    }

    if (!_accessibleCoordinates.contains(current)) { _accessibleCoordinates.add(current); }
    AccessPositiveQuadrantCoordinates(current.Move(Coordinate.Direction.East));
    AccessPositiveQuadrantCoordinates(current.Move(Coordinate.Direction.North));
}

我会给出所有可接受的答案。

非常感谢, 索姆纳特

2 个答案:

答案 0 :(得分:2)

  

但问题是通过递归调用传递的HashSet成员没有反映先前调用中添加的Coordinate成员。

我认为这不太可能。我认为您的Coordinate类更有可能不会恰当地覆盖equalshashCode,这就是该集合无法“找到”值的原因。

顺便说一句,使用这样的静态变量对我来说似乎是一个非常糟糕的主意 - 为什么不在GetAccessibleCoordinateCount()中创建集合并将引用传递给AccessPositiveQuadrantCoordinates,这可以反过来继续在递归调用中传递它吗?

(另外,我强烈建议你开始遵循Java命名约定......)

答案 1 :(得分:1)

我认为使字段_accessibleCoordinates非静态

没有任何问题

并且您应该知道HashSet每次都不保证相同的迭代顺序,您最好为此目的使用LinkedList ...

关于通过引用传递,我发现这篇文章非常有用

java - pass by value - SO link

根据您的操作,您将在每次递归调用中正确更新_accessibleCoordinates。