C ++ - 使用递归对队列进行随机播放

时间:2015-12-19 14:24:03

标签: c++ recursion queue

我有一项任务,要求我基本上创建一个算命应用程序。我需要做的是,首先创建一副牌,然后将其洗牌,并且洗牌过程必须是递归的,并且根据分配没有任何循环。套牌也必须是队列数据结构。

我有一个卡片结构,它有两个char变量,其中一个包含卡片的类型,例如D表示钻石,H表示心脏,另一个变量是卡片的编号,例如4或者J或K.我创建了一个名为deck的卡片队列,我用一个基本循环初始化了牌组,队列的前13个元素是钻石,接下来的13个元素是俱乐部,依此类推。

问题在于洗牌。我的套牌必须是一个队列,但是如果有一个带有数组的解决方案,我可以使用该数组进行混洗,然后将数组传输到队列中。但是目前我不知道怎么做,无论是数组还是队列,伪代码对我来说都是惊人的。

我做了我所有的研究,但没有关于递归的改变,现在我没有想法,我不期待完整的程序解决方案,我只需要一些关于递归的基本想法。 / p>

非常感谢。

1 个答案:

答案 0 :(得分:0)

为了递归地对数组进行洗牌,这个想法如下。

1)取前面元素,随机选择另一个元素,交换它们。

2)随机播放剩余的数组(没有前面的元素)。

3)当前位置位于数组末尾时,递归停止

void shuffle(std::array<Card, 52>& deck, int pos = 0)
{ if (deck.size() - pos < 2) return;

  // select a random element behind the current one
  int rnd = pos + 1 + std::rand() % (deck.size() - pos - 1);

  std::swap(deck[pos], deck[rnd]);

  // recursively shuffle the remainder of the deck
  shuffle(deck, pos + 1);
}

设置套牌并初始化后,您可以拨打shuffle(deck);

p.s:这不是“理想的”C ++ 14代码,因为我们可以使用高级功能,但这只是一个提示,用于如何使用递归对数组进行混洗。