所以我正在开发这个应用程序,一个类有一个递归子程序,接缝将被破坏。
我有一个包含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 Emulator中)。没有堆栈溢出或任何东西。
任何对此的见解将不胜感激。预先谢谢你。
PS。同时尝试使用嵌套循环
答案 0 :(得分:0)
即使您摆脱了无限循环,您的代码也不会产生您想要的输出。您将通过多种方式(从0111、1011、1101和1110)达到1111,因此您的结果将不会唯一
只需将以10为基数的整数转换为以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);
}
}
}