首页 > 代码库 > 递归详解(二)
递归详解(二)
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);
递归详解(二)