Java中的递归排列会产生错误的结果

时间:2014-12-28 12:13:27

标签: 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);
    } 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));

结果正确。

这两种方式似乎与我相同。有人可以解释什么是不同的,以及为什么第一个会产生错误的结果。

由于

2 个答案:

答案 0 :(得分:3)

以下内容继续在for循环

中的每次迭代之间添加prefix的更改
prefix = prefix + numbers.charAt(i);
permutation(prefix,numbers.substring(0, i)+numbers.substring(i+1));

虽然这个只将prefix上的更改传递给下一级调用,但它与此递归函数的用途相匹配

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

答案 1 :(得分:1)

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

prefix = prefix + numbers.charAt(i);

更改将在调用层次结构的每个级别上发生。但是当你这样做时:

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

您只执行一次prefix + numbers.charAt(i)