从甲板上递归处理卡片?

时间:2013-08-14 21:46:38

标签: c# algorithm recursion

标准52卡片组可以使用整数值表示:{0,1,..,50,51}。标准扑克牌包含来自该组的5个值,不重复。

要表示来自牌组的所有52C5独特牌,可以使用以下循环:

    for (int card1 = 0; card1 < 48; card1++)
    {
        for (int card2 = card1 + 1; card2 < 49; card2++)
        {
            for (int card3 = card2 + 1; card3 < 50; card3++)
            {
                for (int card4 = card3 + 1; card4 < 51; card4++)
                {
                    for (int card5 = card4 + 1; card5 < 52; card5++)
                    {
                        var handAbcde = new List<int> { card1, card2, card3, card4, card5 };
                        // do something with the hand...
                    }
                }
            }
        }
    }

我想知道如何使它成为一个递归函数。我试过但是我无法保持卡从最低到最高的顺序,就像上面的for循环一样。

所需输出的示例:(观察从最低到最高的顺序排序,无需重复)

0 1 2 3 4
0 1 2 3 5
0 1 2 3 6
.
.
.
47 48 49 50 49
47 48 49 50 50
47 48 49 50 51

1 个答案:

答案 0 :(得分:3)

这是一个有用的扩展方法,可以使用递归执行您想要的操作:

public static IEnumerable<IEnumerable<T>> GetPermutations<T>(this IEnumerable<T> items, int count)
{
    int i = 0;
    foreach (var item in items)
    {
        if (count == 1) yield return new T[] { item };
        else foreach (var result in items.Skip(i + 1).GetPermutations(count - 1))
            yield return new T[] { item }.Concat(result);
        ++i;
    }
}

以下是一个示例用途,用于生成52张牌组中五张牌的所有可能组合:

foreach (var hand in Enumerable.Range(0, 52).GetPermutations(5))
{
    foreach (var card in hand)
        Console.Write(card + " ");
    Console.WriteLine();
}