1 public class A { 2 static int k=0; 3 public static void main(String args[]) { 4 char[] ss = { ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, 5 ‘5‘, ‘6‘, ‘7‘ }; 6 permutation(ss, 0); 7 } 8 public static void permutation(char[] ss, int i) { 9 10 if (ss == null || i < 0 || i > ss.length) { 11 return; 12 } 13 if (i == ss.length) { 14 String a = new String(ss); 15 System.out.println(a); 16 k++; 17 if(k==4) 18 System.exit(0); 19 } else { 20 for (int j = i; j < ss.length; j++) { 21 char temp = ss[j];// 交换前缀,使之产生下一个前缀 22 ss[j] = ss[i]; 23 ss[i] = temp; 24 permutation(ss, i + 1); 25 temp = ss[j]; // 将前缀换回来,继续做上一个的前缀排列. 26 ss[j] = ss[i]; 27 ss[i] = temp; 28 } 29 } 30 } 31 }
这个递归执行结果很多很多,结果为14!。前四个结果为:
12345671234567
12345671234576
12345671234657
12345671234675
下面分析一下过程:
这么讲吧:
permutation(ss, 0);//初始调用时,i值等于3
为了方便说,后面调用permutation函数时,i值等于几,就叫几号递归
permutation(ss, 0);//0号递归开始执行 判断if条件语句不成立
运行else语句中的for循环,j=0,i<14, //ss.length=14
调用permutation(ss, 0+1);
permutation(ss, 0+1););//1号递归开始执行 判断if条件语句不成立
运行else语句中的for循环,j=1,j<14, //ss.length=14
调用permutation(ss, 1+1);
...
permutation(ss, 13+1););//14号递归开始执行 判断if条件语句成立
执行System.out.println(a); //a=12345671234567
14号递归不成立后,回归13号递归的for循环处,进行j++处理,
运行for循环,j=14,j<14,不成立
13号递归不成立后,回归12号递归的for循环处,进行j++处理,
运行for循环,j=13,j<14,成立。执行
char temp = ss[13];// 交换前缀,使之产生下一个前缀
ss[13] = ss[13];
ss[13] = temp;
permutation(ss, 13 + 1);
时间: 2024-11-13 06:33:57