package com.one;
/*
* 求n个元素的全排列
* abc acb bac bca cab cba
*/
public class Diguiquanpailie {
// k: 当前的交换位置(关注点),与其后的元素交换
public static void f(char[] data, int k) {
if(k == data.length) {
for(int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
System.out.println();
}
for(int i = k; i < data.length; i++) {
{ char t = data[k]; data[k] = data[i]; data[i] = t; } //试探
f(data,k+1);
{ char t = data[k]; data[k] = data[i]; data[i] = t; } //回溯
}
}
public static void main(String[] args) {
char[] data = "ABC".toCharArray();
f(data,0);
}
}
注释试探和回溯的那行代码,如何理解。交换元素时通过Debug发现为什么开始k和 i 值相同,再往后运行k和 i 值就不相同了。
如何理解回溯的过程。

------解决思路----------------------
ki 这样写不知道你好不好看
00 i=k 00 递归 k的值增加1
11 i=k 11 递归 k的值增加1
22 i=k 22 递归 k的值增加1
3 3 第一次输出 k为3 所以执行输出语句
22 23 for i自加1
11 12 for i自加1
11 22 递归 k的值增加
11 3 第二次输出
11 23 for i自加1
11 13 for i自加1
00 01 递归 k的值增加
00 11 递归 k的值增加
00 21 递归 k的值增加
00 3 第三次输出
00 22 递归 k的值增加
00 3 第四次输出
00 23 for i自加1
00 12 递归 k的值增加
00 22 递归 k的值增加
00 3 第五次输出
00 02 递归 k的值增加
00 12 递归 k的值增加
00 22 递归 k的值增加
00 3 第六次输出
00 23 for i自加1
00 13 for i自加1
00 03 for i自加1
请楼主自行验证下 我看了几遍 好像是这个顺序 好困。。。
------解决思路----------------------
k k i
0 i=k 0 0 递归 k的值增加1
1 i=k 1 1 递归 k的值增加1
2 i=k 2 2 递归 k的值增加1
3 3 2 第一次输出 k为3 所以执行输出语句
2 2 3 for i自加1
1 1 2 for i自加1
1 2 2 递归 k的值增加
1 3 2 第二次输出
1 2 3 for i自加1
1 1 3 for i自加1
0 0 1 递归 k的值增加
0 1 1 递归 k的值增加
0 2 1 递归 k的值增加
0 3 2 第三次输出
0 2 2 递归 k的值增加
0 3 2 第四次输出
0 2 3 for i自加1
0 1 2 递归 k的值增加
0 2 2 递归 k的值增加
0 3 2 第五次输出
0 0 2 递归 k的值增加
0 1 2 递归 k的值增加
0 2 2 递归 k的值增加
0 3 2 第六次输出
0 2 3 for i自加1
0 1 3 for i自加1
0 0 3 for i自加1
第一列的K表示 如k为0 时 递归和for循环 条件满足下 所能调用的次数
第二列的k i表示 每一次 递归、循环后 k和i 的值变化