对于一个序列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; } }