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