簡體   English   中英

如何使用靜態變量編寫遞歸函數

[英]How to write a recursive function using static variables

我正在嘗試編寫代碼以獲取猴子從(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));
}

我會給所有可接受的答案要點。

謝謝你,Somnath

但是問題在於跨遞歸調用傳遞的HashSet的成員沒有反映在先前調用中添加的Coordinate成員。

我認為這不太可能。 我認為您的Coordinate類很可能沒有適當地覆蓋equalshashCode ,這就是為什么該集合無法“查找”值的原因。

順便說一句,使用這樣的靜態變量對我來說似乎是個壞主意-為什么不在GetAccessibleCoordinateCount()創建集合並將引用傳遞給AccessPositiveQuadrantCoordinates ,而后者又可以將其遞歸傳遞給遞歸調用?

(另一方面,我強烈建議您開始遵循Java命名約定...)

我看不到使字段_accessibleCoordinates為非靜態的任何問題

並且您應該知道HashSet不能每次都保證相同的迭代順序,因此您最好為此使用LinkedList ...

關於通過引用,我發現這篇文章非常有用

java-按值傳遞-SO鏈接

根據您的操作,您將在每個遞歸調用中正確更新_accessibleCoordinates。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM