局部变量错误的排列

时间:2014-05-05 17:11:11

标签: java

我正在测试斯坦福大学c ++讲座中的排列代码。如果我使用我的局部变量,为什么会引入错误?我试过调试它,但我仍然不明白。

public class JavaApplication9 {

    public static void permutate(String so_far, String rest  ){

        if (rest.equals("")){
            System.out.println(so_far);

        } else {

            for (int i = 0; i < rest.length(); i++){

            so_far = so_far + rest.charAt(i);
            rest =  rest.substring(0,i) + rest.substring(i+1);
            permutate(so_far, rest);

            }

        }

    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        permutate("", "ab");
    }

}

输出应为:ab,ba。

目前正好:ab

2 个答案:

答案 0 :(得分:3)

通过覆盖for循环中restso_far的值,您将丢失原始版本。如果我们展开循环,这就是对permutate的调用。

so_far = "a"
rest = "b"

下次循环:

so_far = "ab"
rest = ""

由于{for循环中so_farrest的值发生了变化,当i = 1时,传入permutate的原始值不能仅用于新的修改版本是

但是,如果在for循环中使用不同的变量名,则展开的循环如下所示:

tmp_so_far = "a"
tmp_rest = "b"

tmp_so_far = "b"
tmp_rest = "a"

下次循环:

tmp_so_far = "ab"
tmp_rest = ""

tmp_so_far = "ba"
tmp_rest = ""

答案 1 :(得分:0)

因为当您将休息更新到新休息时,您将覆盖旧字符串。你在循环中修改它,所以当你做rest.length()它是新的长度,因为你丢失了旧的字符串。

实施例: 当传入休息时==&#34; ab&#34;,在第一次迭代中rest.length()== 2.但在循环中你更新休息到&#34; b&#34;。所以当你从permute()回来时,你的休息现在是&#34; b&#34;并且长度为1,因此当你递增i时,它变为1并且你脱离循环。

更改为newRest解决了问题,因为您仍然将旧的休息传递给方法。