【发布时间】: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/…