递归实现全排列算法

此算法的基本思想:

假定有一个数组,int[] = {1,2,3,4,5};

1.先看数组的最后两个元素:{4,5},它的全排列即是45,54.

2.再看数组的最后三个元素:{3,4,5},它的全排列即是345,354,435,453,534,543.

3.据此,我们可以推断,N个元素S = {r1,r2,r3,...,r(n-1),rn}的全排列即是r1P(S-r1),r2P(S-r2),r3P(S-r3),...,rnP(S-rn);此处P(S-r1)为S数组过滤掉r1后的全排列.

4.如果,我们依次将待排列的数组的后N-1个元素与第一个元素交换,则每次递归处理的都是后N-1个元素的全排列.当数组元素仅有一个时为此递归算法的出口.

以下是此全排列递归算法的实现:

 1 using System;
2
3 namespace ReflectionDemo
4 {
5 public class PankArithmetic
6 {
7 static int count = 0;
8 public static void Pank(int[] list, int k, int m)
9 {
10
11 if (k == m)
12 {
13
14 for (int i = 0; i <= m; i++)
15 {
16 Console.Write(list[i]);
17 }
18 Console.Write(",");
19 Console.WriteLine(++count);
20
21 }
22 else
23 {
24 for (int i = k; i <= m; i++)
25 {
26 Swap(list, k, i);
27 Pank(list, k + 1, m);
28 Swap(list, k, i);
29 }
30 }
31
32 }
33
34 public static void Swap(int[] list, int a, int b)
35 {
36 int temp = list[a];
37 list[a] = list[b];
38 list[b] = temp;
39 }
40
41 public static void test()
42 {
43 int[] list = { 1,2,3,4};
44 Pank(list, 0, 3);
45 }
46 }
47 }

注:原文来自Here,本文为C#版本的实现

posted @ 2011-08-10 20:58  .Sure  阅读(1277)  评论(0编辑  收藏  举报