【问题标题】:Recursive dealing of cards from deck?从甲板递归处理卡片?
【发布时间】:2013-08-14 21:46:37
【问题描述】:

标准的 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

【问题讨论】:

  • 向我们展示您尝试过的递归函数。
  • 以及输出。
  • 您想要的输出不是“从低到高无重复的顺序排列”。
  • 谷歌“组合”和“字典顺序”。生成连续组合的最佳算法不是递归的,而是直接调整数组中的值。
  • @Lee:这是一个有益的谷歌搜索,谢谢。我发现结果中提出了许多可以加快索引散列的想法。我会试试看。特别是这个有几种方法:stackoverflow.com/questions/5307222/…

标签: c# algorithm recursion


【解决方案1】:

这是一个有用的扩展方法,它使用递归来做你想做的事:

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();
}

【讨论】:

  • +1 虽然这不会给出用户显示的输出,但它确实回答了问题。
  • @Kevin:谢谢;实际上,用户的输出对于该问题是无效的。他特别说:“从低到高的顺序排列,不重复”:D
  • 我不确定它为什么无效。你能解释一下吗?
  • 上面的 Linq 解决方案,我必须承认是优雅的。但它比使用 For 循环要慢。
  • @sapbucket:我同意,它要慢得多,但对我来说,Linq 总是值得额外的执行时间,因为它更容易理解它的作用。至于为什么您的输出无效:查看倒数第三行。 “47 48 49 50 49”不是连续的,也不是没有重复的。
猜你喜欢
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2014-05-23
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多