Java 递归中字符串数组的置换

Java 递归中字符串数组的置换,java,recursion,permutation,Java,Recursion,Permutation,输出 String[] test = { "la", "li", "lo" }; language(3, test); private String language(int n, String[] syllables) { // example of N = 3 for (int i = 0; i < syllables.length; i++) { String w1 = syllables[i]; for (int j = 0; j <

输出

String[] test = { "la", "li", "lo" };
language(3, test);

private String language(int n, String[] syllables) { // example of N = 3
    for (int i = 0; i < syllables.length; i++) {
        String w1 = syllables[i];
        for (int j = 0; j < syllables.length; j++) {
            String w2 = syllables[j];
            for (int x = 0; x < syllables.length; x++) {
                String w3 = syllables[x];
                System.out.println(w1 + w2 + w3);
            }
        }
    }
}
n = amount of syllables  
syllables = String Array of the base words 

您将需要以下内容:

lalala
lalali
lalalo
lalila
lalili
lalolo
lilala
lolala
lilili
lololo
......
private void recursiveMethod(int numberofcidelestoadd,String[]音节,String-word){
for(int i=0;i<音节.length;i++){
字符串newWord=单词+音节[i];
如果(NumberOfSydelestLoadd>=0){
递归方法(NumberOfSydelestLoadd-1,音节,新词);
}否则{
System.out.println(newWord);
}
}
}

注意:由于多种原因(如不使用StringBuilder或StringBuffer来创建单词),这实际上是无效的。

您需要以下内容:

lalala
lalali
lalalo
lalila
lalili
lalolo
lilala
lolala
lilili
lololo
......
private void recursiveMethod(int numberofcidelestoadd,String[]音节,String-word){
for(int i=0;i<音节.length;i++){
字符串newWord=单词+音节[i];
如果(NumberOfSydelestLoadd>=0){
递归方法(NumberOfSydelestLoadd-1,音节,新词);
}否则{
System.out.println(newWord);
}
}
}

注意:由于多种原因(如不使用StringBuilder或StringBuffer创建单词),这实际上是无效的。

这将提供您期望的结果:

private void recursiveMethod(int numberOfSyllablesToAdd, String[] syllables, String word) {
    for (int i = 0; i < syllables.length; i++) {
        String newWord = word + syllables[i];
        if (numberOfSyllablesToAdd >= 0) {
            recursiveMethod(numberOfSyllablesToAdd - 1, syllables, newWord);
       } else {
            System.out.println(newWord);
        }
    }
}

私有静态void语言(final int n,final String[]音节,final String currentWord){//n=3的示例
如果(n==0){
System.out.println(currentWord);
}否则{
for(int i=0;i<音节.length;i++){
语言(n-1,音节,当前单词+音节[i]);
}
}
}

这将为您提供您期望的结果:

private void recursiveMethod(int numberOfSyllablesToAdd, String[] syllables, String word) {
    for (int i = 0; i < syllables.length; i++) {
        String newWord = word + syllables[i];
        if (numberOfSyllablesToAdd >= 0) {
            recursiveMethod(numberOfSyllablesToAdd - 1, syllables, newWord);
       } else {
            System.out.println(newWord);
        }
    }
}

私有静态void语言(final int n,final String[]音节,final String currentWord){//n=3的示例
如果(n==0){
System.out.println(currentWord);
}否则{
for(int i=0;i<音节.length;i++){
语言(n-1,音节,当前单词+音节[i]);
}
}
}


您需要选择单个字符,然后选择其他字符。然后对字符串中的其他字符调用相同的permutation()方法。如果字符串的大小==2,则返回原始值及其相反值。连接由否定调用返回的所有字符串。快乐编码。您知道输出中将有
n^n
字符串(如果所有元素都是唯一的)?我认为严格来说,拉拉不是3个字符串的排列。一个排列需要在每个排列中包含所有3个字符串string@shlomi33这取决于定义,有些人可能称之为重复排列argh!线程“main”java.lang.StackOverflower中的异常位于java.lang.System.arraycopy(本机方法),您需要选择单个字符,然后选择其他字符。然后对字符串中的其他字符调用相同的permutation()方法。如果字符串的大小==2,则返回原始值及其相反值。连接由否定调用返回的所有字符串。快乐编码。您知道输出中将有
n^n
字符串(如果所有元素都是唯一的)?我认为严格来说,拉拉不是3个字符串的排列。一个排列需要在每个排列中包含所有3个字符串string@shlomi33这取决于定义,有些人可能称之为重复排列argh!线程“main”java.lang.StackOverflower中的异常位于java.lang.System.arraycopy(本机方法)添加
void
here:-)方法的另一个问题:首次调用方法时必须将
2
作为第一个参数传递,而不是
3
。如果输入数组不是唯一的,它也会打印副本。多亏了efford,正如Florent所说,你必须通过2而不是3才能得到一个3音节的单词。在那里添加
void
:-)你的方法的另一个问题是:在第一次调用方法时,你必须通过
2
作为第一个参数,而不是
3
。如果输入数组不是唯一的,它也会打印副本谢谢efford,就像Florent说的,你必须通过2而不是3才能得到一个3音节的单词。谢谢,看起来很容易理解。这也会打印副本,例如
{“la”,“la”}
,用于我的目的,输入是否包含重复项并不重要。谢谢你指出though@MateuszDymczyk这个问题从来没有说这是应该避免的,但是如果你真的想避免,你可以用
language(3,(newhashset(Arrays.asList(test))).toArray(newstring[0]),“”)替换对
language()
的第一次调用
@FlorentBayle好吧,我从来没有说过这是一件非常糟糕的事情,只是指出它是一个潜在的问题/减速:-)谢谢,看起来真的可以理解。这也会打印出重复的内容,例如,
{“la”,“la”}
出于我的目的,输入是否包含重复内容并不重要。谢谢你指出though@MateuszDymczyk这个问题从来没有说这是应该避免的,但是如果你真的想避免,你可以用
language(3,(newhashset(Arrays.asList(test))).toArray(newstring[0]),“”)替换对
language()
的第一次调用@FlorentBayle嗯,我从来没有说过这是一件非常糟糕的事情,只是指出这是一个潜在的问题/减速:-)