Java中的递归置换生成错误结果

Java中的递归置换生成错误结果,java,recursion,permutation,Java,Recursion,Permutation,问题是生成字典排列 起初,我的代码是这样的: public class Problem24 { public static void main(String[] args) { permutation("","123"); } public static void permutation(String prefix, String numbers) { if (numbers.length() == 0) { System.out.println(prefix)

问题是生成字典排列

起初,我的代码是这样的:

public class Problem24 {
public static void main(String[] args) {
    permutation("","123");
}

public static void permutation(String prefix, String numbers) {
    if (numbers.length() == 0) {
        System.out.println(prefix);
    } else {
        for (int i = 0; i < numbers.length(); i++) {
            prefix = prefix + numbers.charAt(i);
            permutation(prefix,numbers.substring(0, i)+numbers.substring(i+1));
        }
    }

}
}
当我把这两行从

prefix = prefix + numbers.charAt(i);
permutation(prefix,numbers.substring(0, i)+numbers.substring(i+1));
致:

结果是正确的

这两种方式在我看来是等价的。有人能解释什么是不同的,为什么第一个会产生错误的结果吗


谢谢

问题在于,当递归发生时,当值从堆栈中弹出时,当您执行以下操作时:

prefix = prefix + numbers.charAt(i);
permutation(prefix + numbers.charAt(i),numbers.substring(0, i)+numbers.substring(i+1));
更改将发生在调用层次结构的每个级别上。但当你这样做的时候:

prefix = prefix + numbers.charAt(i);
permutation(prefix + numbers.charAt(i),numbers.substring(0, i)+numbers.substring(i+1));

您只执行了一次
前缀+数字.charAt(i)

在for循环的每次迭代之间,下面的一个将不断添加对
前缀的更改

prefix = prefix + numbers.charAt(i);
permutation(prefix,numbers.substring(0, i)+numbers.substring(i+1));
虽然此函数只将
前缀上的更改传递到下一级调用,但它与此递归函数的目的非常匹配

permutation(prefix + numbers.charAt(i),numbers.substring(0, i)+numbers.substring(i+1));
要可视化每个级别下的递归调用,请执行以下操作:

(正确版本)

(错误版本)


谢谢,所以传递的值实际上是相同的,但我忘了我在for循环中使用了
prefix
的值。@AntonZ ya,希望更新后的表对您来说是清楚的,因为错误结果是这样的。
Level:  1  |   2  |   3
        -- | ---- |  ---
prefix  1  |  12  |  123
           |  13  |  132
        2  |  21  |  213
           |  23  |  231
        3  |  31  |  312
           |  32  |  321
Level:   1  |   2    |   3
        --- | ------ | -----
prefix   1  |  12    |  123
            |  123   |  1232
        12  |  121   |  1213
            |  1213  |  12131
       123  |  1231  |  12312
            |  12312 |  123121