2012-09-27 90 views
2

我试图返回字符串数组中值的所有可能的排列组合。我已经提出了以下代码,使所有可能的排列组合;它工作正常。Java - 从递归函数返回

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

为什么不返回所有列表字符串组合添加?更好,不是吗? – thatidiotguy

+0

只是抛出想法,但是你可以在每次迭代过程中改变外部数组,还是返回可以通过每个递归级别返回的值数组? – Xiphos

+0

是的,只是从递归例程中返回数据。您可以返回一个常规的'[]'数组,或者其中一个集合类,后者在您从每个级别返回时都可以添加到其中。 –

回答

3

而不是返回一个列表,我想可能更好地工作,通过列表作为参数,并填充它里面的方法:

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

你可以有一个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; 
} 
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); 
     } 
    } 
} 

您还可以使用,而不是一个String一个ListArray,一旦基本概念工程..