[英]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.