全排列-递归解法

对于一个序列r={4,3,5…}求全排列?

递归解法的思路:

 (1)对于一个序列R={4,3,5…},它其中的每一个数设为Ri,它的全排列我们设为perm(R).

 (2)对于R的全排列我们可以转化成几个小的问题:4开头,{3,5…}的全排列,3开头,{4,5…}的全排列,5开头,{4,3…}的全排列
    即Perm(R)= {R1Perm(R-R1) , R2Perm(R-R2) , R3Perm(R-R3)......,RnPerm(R-Rn)}

其核心思想就是:将每个元素放到n个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去。
   比如:
   a b c
首先将a放到最前方(跟第一个元素交换),然后排列b c,然后将a放回本来位置
结果 a b c; a c b
其次将b放到最前方(跟第一个元素交换),然后排列a c,然后将b放回
结果 b a c; b c a

 

 

 

代码实现(Java):

public class ComputePermutation {
    static int total = 0;

    public static void main(String[] args) {
        int[] arr = { 3, 4, 5 };
        long total = perm(arr, 0, 2);
        System.out.println("The total permutation:" + total);
    }

    public static void swap(int[] arr, int x, int y) {
        int temp = 0;
        temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;

    }

    public static long perm(int arr[], int start, int end) {

        // 单元素排列 直接输出
        if (start == end) {

            for (int i = 0; i <= end; i++) {

                System.out.print(arr[i]);

            }
            total++;

            System.out.println();
        } else {
            for (int i = start; i <= end; i++) {

                swap(arr, start, i);
                perm(arr, start + 1, end);
                swap(arr, start, i);
            }

        }
        return total;

    }
}

posted @ 2009-11-03 11:55  Chris Wang  阅读(279)  评论(0编辑  收藏  举报