递归实现全排列算法

此算法的基本思想:

假定有一个数组,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#版本的实现

转载于:https://www.cnblogs.com/riverdeng/archive/2011/08/10/2134191.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值