前段时间部门组织的一次基础知识考试,其中的一道编程题是:
给一个数组,如"123",要求输出出其所有的组合,如"123"对应的输出便是 123、132、213、231、312、322
就这个题本身来说,并不算难,不过当时要求用C语言写这个程序,一时感觉无从下手,我记得当时是花了不少时间,想了好几种算法,写了一大堆代码,估计还写的特别烂,总之搞的我比较郁闷。今天吃晚饭后闲来无事,便用C#写了一下,一气呵成,并且非常精简。
static
void Main(string[] args)
{
List<char> data = new
List<char>();
data.AddRange("123");
foreach (var item in GetAllSequence(data))
{
Console.WriteLine(item);
}
}
static
IEnumerable<string> GetAllSequence(List<char> data)
{
var count = data.Count;
if (count == 0)
{
yield
break;
}
if (count == 1)
{
yield
return data[0].ToString();
yield
break;
}
for (int i = 0; i < count; i++)
{
char ch = data[i];
data.RemoveAt(i);
foreach (var item in GetAllSequence(data))
{
yield
return ch + item;
}
data.Insert(i, ch);
}
}
由于用了C#中的yield而生成迭代器模式,使得整个程序非常简洁。当然,这个程序的执行效率很低,但是,写这个程序前后花了不到5分钟,算法思路和实现非常直观,维护和调试起来也十分方便。在很多计划大于变化的时候,用C#这种快速开发的语言无疑比C要来的实在的多。