在Ruby中堆栈级别太深,试图绘制随机卡

我在运行下面的代码时出现“堆栈级太深”的错误。 如果选择的随机卡不在那里,它会选择另一张随机卡。 我想我应该以某种方式处理代码,但我不确定如何。 有什么建议?

def hit choice_of_card = rand($deck.length); #choose a random card out of the deck drawn_card = $deck[choice_of_card]; #draw that random card from the deck if drawn_card != 0 #if there is a card there $deck[choice_of_card] = 0; #remove that card from the deck by making the space blank if drawn_card == 11 #if you draw an ace self.ace_count += 1; end self.hand_value += drawn_card ; else hit; #if there is no card at that space then redraw (recursion) end end 

我认为递归导致错误是安全的。 在我看来你不需要递归,你可以循环直到你得到drawn_card!= 0,例如,

 drawn_card = 0 while drawn_card == 0 choice_of_card = rand($deck.length); #choose a random card out of the deck drawn_card = $deck[choice_of_card]; #draw that random card from the deck end 

如上所述,基于随机数生成器,递归深度是“无限的”。 考虑当牌组中只剩下一张牌时。 它将继续选择随机数并递归,直到它最终选择剩下的一张卡; 一个非常深的堆栈可能。 如果一张卡留在52张卡片组中,则任何一次不选择剩余卡片的几率为51/52 = 98%。 要获得50%的选择机会,您需要大约35次迭代/递归。 为了达到99%的选择机会,它需要大约237次迭代: (1.0 - (51/52)^237)=99%

要使用此特定实现,有必要将其更改为循环(只是迭代而不是递归)。 然而,这仍然不是非常有效,并且可能在找到剩余的少数卡之一之前循环很长时间。 另一种方法可能是在拆除卡片后从卡座上移除间隙,然后总会有击中。 或者可以预先使用改组算法 ,然后按顺序迭代它们。