一道关于排列组合的算法题

前段时间部门组织的一次基础知识考试,其中的一道编程题是:

给一个数组,如"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要来的实在的多。

原文地址:https://www.cnblogs.com/TianFang/p/1240281.html