我正在测试斯坦福大学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
答案 0 :(得分:3)
通过覆盖for循环中rest
和so_far
的值,您将丢失原始版本。如果我们展开循环,这就是对permutate
的调用。
so_far = "a"
rest = "b"
下次循环:
so_far = "ab"
rest = ""
由于{for循环中so_far
和rest
的值发生了变化,当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解决了问题,因为您仍然将旧的休息传递给方法。