C#排列数字组合方法
因一时兴趣为了计算福利彩票的排列数中奖概率,故写了以下排列数方法。有错误的地方请指正。
使用方法:
基数35个数,创建七位数组合
List<int[]> list = Arrange_Recursion(7, 0, new List<int[]>());
一共6724520种 用时 4821.1298 毫秒
/// <summary> /// 使用递归创建 组合数排列 /// </summary> /// <param name="combinationNum">组合数</param> /// <param name="StartNum">开始数 从0开始</param> /// <param name="finalList">最终排列 数组</param> /// <returns></returns> public List<int[]> Arrange_Recursion(int combinationNum, int StartNum, List<int[]> finalList) { StartNum++; if (StartNum != combinationNum) { int[] arr = CreterArray(35); List<int[]> list = CreterArrange(finalList, arr); return Arrange_Recursion(combinationNum, StartNum, list); } else { return finalList; } } /// <summary> /// 创建排列 /// </summary> /// <param name="finalList"></param> /// <param name="arr"></param> /// <returns></returns> private static List<int[]> CreterArrange(List<int[]> finalList, int[] arr) { List<int[]> list = new List<int[]>(); if (finalList.Count != 0) { foreach (int[] arr_ints in finalList) { foreach (int s2 in arr) { if (arr_ints[arr_ints.Length - 1] < s2) { int[] nArr = { s2 }; list.Add(arr_ints.Concat(nArr).ToArray()); } } } } else { //初始化数组 最低2个组合排列 foreach (int s1 in arr) { foreach (int s2 in arr) { if (s2 > s1) { int[] nArr = { s1, s2 }; list.Add(nArr); } } } } return list; } /// <summary> /// 创建多少位数组 /// </summary> /// <param name="arr_length">数组长度</param> /// <returns></returns> private static int[] CreterArray(int arr_length) { int[] arr = new int[arr_length]; for (int i = 1; i <= arr_length; i++) { arr[i - 1] = i; } return arr; }