假定给你a b c三个字符,让你按序列输出 abc, acb, bac, bca,cab,cba.
先看整段代码,看完有分步解析
public class Test {
private static char[] chars = new char[]{'a','b','c'};
private static char[] ch = new char[chars.length];
private static boolean[] flag = new boolean[chars.length];
private static void sort(int index){
if (index == chars.length){
for (int i = 0; i < chars.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
return;
} else {
for (int i = 0; i < chars.length; i++) {
if (flag[i]){
continue;
}
ch[index] = chars[i];
flag[i] = true;
sort(index + 1);
flag[i] = false;
}
}
}
public static void main(String[] args) {
sort(0);
}
}
先来看初始化内容
//创建一个你需要全排列的字符数组
private static char[] chars = new char[]{'a','b','c'};
//创建一个等长的接受字符数组
private static char[] ch = new char[chars.length];
//相当于给每个字符打上标记, 这里false相当于可用.true为可用
//falg[0] == true 表示当前这个字符在前面已经用过了,不能再次使用
private static boolean[] flag = new boolean[chars.length];
看调用的
再来看递归的出口
//用index判断是否可以打印
if (index == chars.length){
for (int i = 0; i < chars.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
return;
}
递归调用部分
for (int i = 0; i < chars.length; i++) {
if (flag[i]){ //看是否前面字符数组已经用过
continue;
}
ch[index] = chars[i];
flag[i] = true; //设置不可用
sort(index + 1); // 调用下一次递归 index+1 位置的字符
flag[i] = false; //上面一行执行调用完成出来后,设置可用
进行下一次for循环比如 i = 2,
}
不bb,看着图走一遍应该…, 画画水平有限,只画了第一个循环的 i = 0的情况;
如果有…更好的,欢迎大佬,说下 嘿嘿