62,046
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
var cnt = 0;
foreach (var r in 排列(new List<int> { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }, 7))
{
Console.Write("第{0}个排列:\t", ++cnt);
foreach (var p in r)
Console.Write("{0} ", p);
Console.WriteLine();
}
Console.WriteLine(".......按任意键退出");
Console.ReadKey();
}
private static IEnumerable<List<int>> 排列(List<int> array, int len)
{
return 排列(array, len, array.Count);
}
private static IEnumerable<List<int>> 排列(List<int> array, int len, int count)
{
if (count >= len)
{
if (len < 1)
yield return new List<int>();
else
{
foreach (var r in 排列(array, len, count - 1))
yield return r;
foreach (var r in 排列(array, len - 1, count - 1))
{
var t = r.ToList();
t.Add(array[count - 1]);
yield return t;
}
}
}
}
}
}
不过写代码其实没啥意思,重点是要有递归、迭代的算法基础,没基础就没有未来。 static void Main(string[] args)
{
var cnt = 0;
var ex = new List<int> { 15 };
var q = from x in 排列(new List<int> { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }, 7)
where !(from z in x where ex.Contains(z) select z).Any()
select x;
foreach (var r in q.Take(3))
{
Console.Write("第{0}个排列:\t", ++cnt);
foreach (var p in r)
Console.Write("{0} ", p);
Console.WriteLine();
}
Console.WriteLine(".......按任意键退出");
Console.ReadKey();
}
这并不是在什么“先计算出来整个排列结果,然后再排除一些结果”,而是在“逐行”进行过滤,因为 Linq 是延迟执行的,它会迭代并且优化空间和时间。
实际上这里可以看出很多 .net 编程模式,不是原始的简单的什么 c++ 简单函数可以比拟的。