public class QuanPailie { /** 统计总数 */ static int total = 0; /** allRank调用次数 */ static int call = 0; public static void swap(int[] array, int a, int b) { if (a == b) { return; } array[a] = array[a] ^ array[b]; array[b] = array[a] ^ array[b]; array[a] = array[a] ^ array[b]; } public static void print(int[] array) { for (int element : array) { System.out.print(element + " "); } System.out.println(); total++; } /** * * 数组第一个元素固定,其他后续的元素再allRank(array, begin + 1, length); * (当然,还需要轮流让每个元素放在第一位) * @param array * @param begin * @param length */ public static void allRank(int[] array, int begin, int length) { call++; if (begin == length - 1) { print(array); //每个递归的最后,是打印输出 } else { for (int i = begin; i < length; i++) { swap(array, begin, i);//使用for(int i = begin; i < length; i++)去轮流放在第一位 allRank(array, begin + 1, length);//无视第一位,将后续的元素继续递归 swap(array, i, begin);//如果不恢复现场,那么allRank就是一个会改变array的函数,那么 //使用“for(int i = begin; i < length; i++)去轮流放在第一位的做法” //就会失效。 } } } public static void main(String[] args) { int[] array = { 1, 2, 3, 4, 5 }; allRank(array, 0, 5); System.out.println("不同顺序的总数(5!):"+total+"/n allRank()被调用的总数:"+call); } }