簡體   English   中英

使用recusion for Android的異常行為

[英]Abnormal behaviour using recusion for Android

所以我正在研究這個應用程序,並且一個類有一個遞歸的子程序,接縫被打破。

我有一個有4個特殊成員變量的類,每個成員有3個可能的值。 上述函數應該為每個可能的對象置換生成唯一對象(存儲在數組中)。

這是代碼的樣子:

private void generate(int one, int two, int three, int four) {
    if (one == 3 || two == 3 || three == 3 || four == 3) {
        return;
    }

    generate(one+1, two,   three,   four);
    generate(one,   two+1, three,   four);
    generate(one,   two,   three+1, four);
    generate(one,   two,   three,   four+1);

    arrayList.add(new Permu(one, two, three, four));
}

現在在任何人讓我使用ArrayList之前,我將會不斷地從那里刪除東西。

無論如何,現在在我告訴你這里發生了什么之前,你應該首先知道我在處理中編寫了相同的代碼(而不是創建一個新的類,它只輸出排列,所以我可以看到它完成了)和這個(幾乎)精確的代碼工作得很好。 也就是說,當您嘗試在Android上運行此代碼時,請查看Android Studio的輸出

0000
1000
2000
2100
2200
2210
2220
2221
2222
2211
2221
2222
2212
2222
2201
2211
2221
2222

它繼續這種模式,直到它耗盡內存和崩潰(在Android模擬器中)。 沒有堆棧溢出或任何東西。

任何對此的見解都將非常感激。 先感謝您。

PS。 試着在同一時間嘗試使用嵌套循環

即使你擺脫了無限循環,你的代碼也不會產生你想要的輸出。 您將以多種方式(從0111,1011,1101和1110)到達1111,因此您的結果將不是唯一的

你可以在沒有遞歸的情況下解決這個問題,只需將base-10整數轉換為base-3:

    for (int i = 0; i < 81; i++) {
        System.out.println(Integer.toString(i, 3));
    }

要獲得更優雅的輸出,請使用以下內容:

    System.out.printf("%04d%n", Integer.parseInt(Integer.toString(i, 3), 10));

如果您仍想使用遞歸,這是一個解決方案:

int numberOfDigits = 4;
int highestDigitValue = 2;

public static void main(String[] args) {
    new Tester().generate("");
}

private void generate(String str) {
    if (str.length() == numberOfDigits) {
        System.out.println(str);
    } else {
        for (int i = 0; i < highestDigitValue + 1; i++) {
            generate(str + i);
        }
    }
}

暫無
暫無

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

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