带递归的字符串排列

Vor*_*tex 6 java string recursion

我是一名java初学者,并尝试从java编程书中进行字符串排列练习.我正在定义两种方法:

public static void displayPermutation(String s)
public static void displayPermutation(String s1, String s2)
Run Code Online (Sandbox Code Playgroud)

第一种方法只是调用displayPermutation(" ", s).第二种方法使用循环将字符从s2移动到s1,并使用新的s1和s2递归调用它.基本情况是s2为空并将s1打印到控制台.

任何人都可以帮我找到以下代码的问题?

她的榜样:

 public static void displayPermutation(String s) {
            displayPermuatation("", s);
        }

    private static void displayPermuatation(String s1, String s2) {
        //base case: when s2 is empty, print s1
        if (s2.isEmpty()) {
            System.out.println(s1);
        }
        else {          
        for (int i = 0; i < s2.length(); i++) {
                        //move a char from s1 to s2, and recursively invokes it with 
                        //new s1 and s2
            s1 = s1 + s2.charAt(i);
            s2 = s2.substring(0, i) + s2.substring(i+1);
            displayPermuatation(s1, s2);
        }
    }
   }
Run Code Online (Sandbox Code Playgroud)

如果s ="abc",则仅打印:abc acb

似乎在第一次调用displayPermuatation("","abc")时,它没有完成for循环....任何评论?

感谢下面的所有评论.我认为我犯的错误是因为将对象作为参数传递给方法实际上是传递引用.它不像原始数据(通过值传递).更改对象时,将影响使用该对象的以下方法调用.

Meh*_*gör 5

不要改变s1s2在循环中导致错误.只需将这些定义作为参数传递给递归函数.像这样:

.
.
for (int i = 0; i < s2.length(); i++) {
        displayPermuatation(s1 + s2.charAt(i), s2.substring(0, i) + s2.substring(i+1));
    }
.
.
Run Code Online (Sandbox Code Playgroud)


Hem*_*ant 2

您的代码的问题是您正在更改循环中 s1 和 s2 的值,这会影响循环中的以下迭代,请参阅以下代码,我已修复此问题。

public static void displayPermutation(String s) {
    displayPermuatation("", s);
}

private static void displayPermuatation(String s1, String s2) {
    // base case: when s2 is empty, print s1
    if (s2.isEmpty()) {
        System.out.println(s1);
    } else {
        for (int i = 0; i < s2.length(); i++) {
            // move a char from s1 to s2, and recursively invokes it with
            // new s1 and s2
            displayPermuatation(s1 + s2.charAt(i), s2.substring(0, i) + s2.substring(i + 1));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)