给一个数组,如"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分钟,算法思路和实