You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归函数为何返回None而非预期值?(二十一点游戏场景)

解决二十一点递归计算分数返回None的问题

问题根源

你的代码存在两个核心问题,分别导致返回None或原始分数:

  1. ace_conversion函数未返回递归结果:修改A(11)为1后调用了get_score,但没有把该调用的结果返回给上层,导致get_score中return self.ace_conversion(hand)实际拿到的是None。
  2. 旧代码未传递修正后的分数:调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:45:22