Python递归函数为何返回None而非预期值?(二十一点游戏场景)
解决二十一点递归计算分数返回None的问题
问题根源
你的代码存在两个核心问题,分别导致返回None或原始分数:
ace_conversion函数未返回递归结果:修改A(11)为1后调用了get_score,但没有把该调用的结果返回给上层,导致get_score中return self.ace_conversion(hand)实际拿到的是None。- 旧代码未传递修正后的分数:调用
ace_conversion修改手牌后,没有重新计算并返回新分数,最终返回的是修改前的原始总分。
修正后的代码
def get_score(self, hand): total = 0 for card in hand: total += card if total > 21: if 11 in hand: # 委托ace_conversion处理A转换,并返回其计算结果 return self.ace_conversion(hand) # 无A可转换或转换后仍超21时,直接返回当前总分 return total def ace_conversion(self, hand): index = hand.index(11) hand[index] = 1 # 转换A后,必须返回重新计算的分数,让递归链传递最终结果 return self.get_score(hand)
修正逻辑说明
- 当手牌总分超21且存在A时,
get_score调用ace_conversion转换一个A为1,然后返回ace_conversion的结果(即转换后的新分数)。 ace_conversion完成转换后,必须调用get_score重新计算并返回结果,确保递归调用的每一层都能把最终的正确分数传递回去。- 递归会自动处理多A场景:比如手牌为
[11,11,10],第一次转换后总分22仍超21,会再次触发转换,直到总分≤21或无A可转换。
内容的提问来源于stack exchange,提问作者Zach Reese
相关产品推荐
相关产品推荐

