在下面的这个求排列组合的算法中(perm方法),我不是很明白其原理。那个for循环用得不明白其意义。public class Test { public static void main(String[] args) {
char buf[] = { 'a', 'b', 'c', 'd'}; perm(buf, 0, buf.length - 1);
} public static void perm(char[] buf, int start, int end) {
if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
for (int i = 0; i <= end; i++) {
System.out.print(buf[i]);
}
System.out.println();
} else {// 多个字母全排列
for (int i = start; i <= end; i++) {
char temp = buf[start];// 交换数组第一个元素与后续的元素
buf[start] = buf[i];
buf[i] = temp; perm(buf, start + 1, end);// 后续元素递归全排列 temp = buf[start];// 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
}
}
}}
char buf[] = { 'a', 'b', 'c', 'd'}; perm(buf, 0, buf.length - 1);
} public static void perm(char[] buf, int start, int end) {
if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
for (int i = 0; i <= end; i++) {
System.out.print(buf[i]);
}
System.out.println();
} else {// 多个字母全排列
for (int i = start; i <= end; i++) {
char temp = buf[start];// 交换数组第一个元素与后续的元素
buf[start] = buf[i];
buf[i] = temp; perm(buf, start + 1, end);// 后续元素递归全排列 temp = buf[start];// 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
}
}
}}
ABCD
for循环,目的是得到每个字母开头的序列
例如以上第一遍输出 AXXX
第二遍BXXX
......利用递归,处理除开头字母外的所有,层层往下,到底后层层回去就是了AXXX进来
ABXX
ACXX
ADXXABXX进来
ABCX
ABDXABCX进来,只有D了
ABCD
for (int i = start; i <= end; i++) {
char temp = buf[start];// 交换数组第一个元素与后续的元素
buf[start] = buf[i];
buf[i] = temp; perm(buf, start + 1, end);// 后续元素递归全排列 temp = buf[start];// 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
}1、交换数组第一个元素与后续的元素
拿a b c d 四元素来说目的是递归数组首元素
例如:第一次调用start=0 那么就是a 和 a 调换 这就是a作为首字目,
在内层中a 已经确定为首元素后,b的这层也是以b为首字母开始递归,依次类推。2、 perm(buf, start + 1, end);// 后续元素递归全排列
这个就是核心了 a b c d 第一次调用确定了a为首字母后 就要确定b c d 所有的全排列方式了,这里用到递归思想,即
a为首字母的全排列 = b c d 的全排列
(b c d) 的全排列 = b 为首字母 +(c d)全排列
= c 为首字母 +(b c)全排列
= d 为首字母 + (a c) 全排列
(c、d)全排列 = c 为首字母 + d全排列
= d 为首字母 + c全排列
(b 、c) (a、c) 的全排列与(c、d)类似
d全排列 和 c全排列 这种就会打印排序的数组所有元素了。
3、
temp = buf[start];// 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
这个很重要 就是将数组元素恢复,例如 a b d c 这种排序 会修改数据的顺序,我们需要再打印本次排列后将修改的顺序恢复。
这些就是我的理解 ,希望能帮助你
可是Java中怎么老讲递归呢!
求解!