1

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

   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
4

2 回答 2

2

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

要使用这个特定的实现,有必要将其更改为循环(只是迭代而不是递归)。但是,这仍然不是很有效,并且可能会循环很长时间才能找到为数不多的剩余卡片之一。另一种方法可能是在牌被移除时从牌组中移除间隙,然后总会有命中。或者,也许可以预先使用洗牌算法,然后按顺序遍历它们。

于 2012-10-04T13:24:31.373 回答
1

我认为可以肯定地说递归导致了错误。在我看来你不需要递归,你可以循环直到你得到draw_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
于 2012-10-04T13:28:12.903 回答