Вопрос

I'm getting an error "stack level too deep" running the code below. If the random card picked is not there it picks another random card. I suppose I should chance the code somehow, but I'm not sure how. Any suggestions?

   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
Это было полезно?

Решение

I think it's safe to say the recursion is causing the error. Seems to me you don't need recursion, you could just loop until you get drawn_card != 0, e.g.,

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

Другие советы

As written, the recursion depth is "unlimited" based on the random number generator. Consider when there is only one card left in the deck. It will keep choosing random numbers and recursing until it finally picks the one card left; a very deep stack potentially. With one card remaining in a 52 card deck, the odds of not selecting the remaining card any one time is 51/52=98%. To get to a 50% chance of selecting it, you need about 35 iterations/recursions. To reach a 99% chance of selecting it, it needs about 237 iterations: (1.0 - (51/52)^237)=99%.

To use this particular implementation, it would be necessary to change it to a loop (just iterate rather than recurse). However, that is still not very efficient and could loop a long time before finding one of the few remaining cards. An alternative might be to remove the gaps from the deck as cards are removed and then there will always be a hit. Or maybe use a shuffling algorithm up front and then just iterate through them sequentially.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top