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

问题在于生成词典编排.

一开始,我的代码是这样的:

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));
        }
    }

}
}

结果:

123
1232
1213
12131
12312
123121

当我从

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 = 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));

要可视化每个级别下的递归调用:

(正确的版本)

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
上一篇:Codeforces 1294E Obtain a Permutation(思维)


下一篇:我想计算带有置换的“ distance_table = []”中两个值之间的差,在这种情况下如何正确使用置换?