首页 > 代码库 > 递归详解(二)

递归详解(二)

 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);

递归详解(二)