当前位置: 代码迷 >> J2SE >> 一个使用递归求n个元素全排列的程序,有点不懂,求解答
  详细解决方案

一个使用递归求n个元素全排列的程序,有点不懂,求解答

热度:77   发布时间:2016-04-23 19:53:29.0
一个使用递归求n个元素全排列的程序,有些不懂,求解答
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 的值变化
  相关解决方案