Android上使用Recusion的异常行为

时间:2019-04-10 16:20:27

标签: java android recursion

所以我正在开发这个应用程序,一个类有一个递归子程序,接缝将被破坏。

我有一个包含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。同时尝试使用嵌套循环

1 个答案:

答案 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);
        }
    }
}