Java - 从递归函数返回

时间:2012-09-27 19:57:46

标签: java arrays recursion permutation

我正在尝试返回String数组中所有可能的值排列。我想出了以下代码,可以进行所有可能的排列;它工作正常。

private void combineArray(String sPrefix, String[] sInput, int iLength) {
    if (iLength == sPrefix.length()) {
        //This value should be returned and concatenated:
        System.out.println(sPrefix);
    } else {
        for (int i=0; i<sInput.length; i++) {
            combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength);
        }
    }
}

如果我输入{x,y,z},它会打印到控制台:

xyz
xzy
yxz
yzx
zxy
zyx

我的问题是我找不到将这些值返回到原始调用函数的方法。所以我希望这个函数不返回'void',而是一个包含sPrefix的连接值的'String'。

我一直在努力解决这个问题,现在我似乎看不清楚了。 :)任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

我认为将作为参数传递给列表并将其填充到方法中可能会更好,而不是返回列表:

private void combineArray(List<String> lOut, String sPrefix, String[] sInput, int iLength) {
    if (iLength == sPrefix.length()) {
        //This value should be returned and concatenated:
        System.out.println(sPrefix);
        lOut.add(sPrefix);
    } else {
        for (int i=0; i<sInput.length; i++) {
            combineArray(lOut, sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength);
        }
    }
}

然后,您可以使用包装器方法创建new ArrayList<String>,将其传递给上述方法,然后将其返回。

答案 1 :(得分:1)

你可以拥有ArrayList<String>并添加所有字符串..然后你可以返回这个ArrayList ..

List<String> listString = new ArrayList<>();
private void combineArray(String sPrefix, String[] sInput, int iLength) {
    if (iLength == sPrefix.length()) {
        listString.add(sPrefix);
        //This value should be returned and concatenated:
        System.out.println(sPrefix);
    } else {
        for (int i=0; i<sInput.length; i++) {
            combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength);
        }
    }
    return listString;
}

答案 2 :(得分:0)

继续添加相同的输出..像这样:

private String combineArray(String sPrefix, String[] sInput, int iLength, String output) {
    if (iLength == sPrefix.length()) {
        //This value should be returned and concatenated:
        System.out.println(sPrefix);
        output = output+"|+sPrefix;
        return output;
    } else {
        for (int i=0; i<sInput.length; i++) {
            output = combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength, output);
        }
    }
}

一旦基本概念有效,您也可以使用ListArray而不是String。