-2

我用Java编写的这种方法有问题。

方法是取两个字符串。第一个字符串sArr用于跟踪在解析第二个字符串时添加的字母。第二个字符串str是一个整数字符串,其中每个整数按顺序用于添加到sArr. 每个整数指的是不同的字母数组,例如:

 String[] two = {"A", "B", "C"};

目前它是另一种方法的辅助方法。如果我输入任何内容,它只会使用输入的第一个数字。它应该从数字中输出集合的所有排列。所以输入 22 将输出:AA, AB, AC, BA, BB, BC, CA, CB, CC

我一直在使用的测试输入是printStrAux("", 23); 并且随后的输出是集合中的所有字母,2如下所示:ABC

我不一定想得到答案,但任何帮助都会很棒。

public static void printStrings(String str){
    if(isAllDigits(str))
        System.out.println(printStrAux("", str));
}

protected static String printStrAux(String sArr, String str){
    if(str.equals(""))
        return sArr;


    else{

        Integer val = Integer.parseInt(str.substring(0, 1));

        switch (val) {
        case 1: printStrAux(sArr, str.substring(1));
        break;
        case 2: 
            for(int i = 0; i < two.length; i++){
                printStrAux(sArr += two[i], str.substring(1));
            }

        break;
        case 3: 
            for(int i = 0; i < three.length; i++){
                printStrAux(sArr += three[i], str.substring(1));
            }

        break;

        case 4:  
            for(int i = 0; i < four.length; i++){
                printStrAux(sArr += four[i], str.substring(1));
            }

        break;
        case 5:  
            for(int i = 0; i < five.length; i++){
                printStrAux(sArr += five[i], str.substring(1));
            }

        break;
        case 6:  
            for(int i = 0; i < six.length; i++){
                printStrAux(sArr += six[i], str.substring(1));
            }

        break;
        case 7:  
            for(int i = 0; i < seven.length; i++){
                printStrAux(sArr += seven[i], str.substring(1));
            }

        break;
        case 8:  
            for(int i = 0; i < eight.length; i++){
                printStrAux(sArr += eight[i], str.substring(1));
            }

        break;
        case 9:  
            for(int i = 0; i < nine.length; i++){
                printStrAux(sArr += nine[i], str.substring(1));

        }
        break;
        case 0:  {
            printStrAux(sArr, str.substring(1));
        }
        break;


        }

    }
    return sArr;
}

请记住,对于我在这里做什么而不是我想要什么,我几乎没有真正的线索。

4

3 回答 3

2

退一步想想递归的基本原理。如果您暂时摆脱除空列表以“2”开头的列表之外的所有情况,这可能会有所帮助。稍后将案件放入其他数字。

像这样的收集递归函数的模式是:

private Type func(Type accumulator, List input) {
    if(input.size() == 0) {
        return accumulator;
    } else {
        Type myAccumulated = someOperation(accumulator, input.head());
        return func(myAccumulated, input.tail();
    }
}

(为了简洁起见,我假装 List.head() 和 List.tail() 存在。你用 substring() 实现了这些)。

在您的情况下,Type是 String 并且您使用 String 作为字符列表。

努力适应这种一般模式。您没有做的一件基本事情是捕获递归调用的输出func()并将其合并到返回给调用者的内容中。


除了递归:

  • 考虑使您Type的数据结构类似于 List<List<Char>> 而不是 String。它可能更容易推理,您可以编写另一种方法将其转换为字符串。
  • two与其拥有名为 等的变量,不如three拥有一个序列数组。sequences[2] = {"A","B","C"}. 那么你就不需要一堆几乎相同的case块了。
于 2013-05-01T12:25:42.633 回答
1

在您对 printStrAux 的递归调用中,您不会保留返回值 sArr。

于 2013-05-01T11:25:29.453 回答
1

当你递归调用你的方法时,你需要捕获它的返回值,fe:

sArr = printStrAux(sArr += two[i], str.substring(1));
于 2013-05-01T11:25:37.307 回答