因为一段程序需要用到排列组合,上网查找现成的c#源代码,结果都是采用递归调用的,我觉得这种方式有一些缺点,所以想能否用其他方法实现。通过观察一个排列组合的结果可以总结出规律来:(过段时间补充),现把已经写好的现成的代码贴出来
1
using System;
2
3
namespace JJBase.ARITHMETIC
4
{
5
/// <summary>
6
/// JJBase 的摘要说明。
7
/// 函数的功能是返回一个排列组合
8
/// first date:2005-9-3
9
/// author:梁俊杰
10
/// </summary>
11
public class Combination
12
{
13
public Combination(){}
14
public string[,] Combin(string[] a,int r)
15
/*传入一个字符串数组,sub是取数组中的字符串的个数
16
阶乘公式:http://blog.blogchina.com/upload/2004-11-04/20041104114227831468.gif
17
C(n,r)=n!/(r!*(n-r)!)
18
本程序采用的算法是:从左到右取值r个不重复的值,保存r个位置到pos[],其中pos[i]的数值肯定比pos[i+1]小
19
如果pos[i]到达a数组最后位置,则pos[i-1]的数值加1;
20
*/
21
{
22
int total=a.Length;
23
string[] oneResult=new string[r];
24
int combins=0;//组合个数
25
combins=Factorial(total)/(Factorial(r)*Factorial(total-r));
26
string[,] result=new string[combins,r];
27
int[] pos=new int[r];
28
for(int i=0;i<r;i++)
29
{
30
pos[i]=i;//初始化位置值
31
}
32
pos[r-1]--;
33
for (int l=0;l<combins;l++)//组合个数已经确定
34
{
35
//判断位置是否合法
36
//说明此时需要进位
37
pos[r-1]++;
38
for(int i=r-1;i>=0;i--)
39
{
40
int k=r-1-i;
41
if(pos[i]>=total-k)
42
{
43
int x=pos[i-1];
44
x++;
45
pos[i-1]=x;
46
for(int m=i;m<r;m++){x++;pos[m]=x;}
47
}
48
else{break;}
49
}
50
//取得正确的位置或者下一个位置
51
//把一个结果存入数组result
52
for (int j=0;j<r;j++)
53
{
54
result[l,j]=a[pos[j]];
55
}
56
}
57
return result;
58
59
}
60
public int Factorial(int n)
61
//返回阶乘的个数
62
//n!=?
63
{ int result=1;
64
for(int i=1;i<=n;i++){result*=i;}
65
return result;
66
}
67
}
68
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68
