在下面的这个求排列组合的算法中(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;
}
}
}}

解决方案 »

  1.   

    原理其实很简单,用递归实现
    ABCD
    for循环,目的是得到每个字母开头的序列
    例如以上第一遍输出 AXXX
    第二遍BXXX
    ......利用递归,处理除开头字母外的所有,层层往下,到底后层层回去就是了AXXX进来
    ABXX
    ACXX
    ADXXABXX进来
    ABCX
    ABDXABCX进来,只有D了
    ABCD
      

  2.   


    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 这种排序 会修改数据的顺序,我们需要再打印本次排列后将修改的顺序恢复。
    这些就是我的理解 ,希望能帮助你
      

  3.   

    for内部将某index与其后所有的数据分别交换后递归到下个位置
      

  4.   

    递归真的好吗?我写过一个线程的问题递归在数小的时候还好,到了一定时间几乎就看不见它在运行,慢啊!
    可是Java中怎么老讲递归呢!
    求解!