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

Python递归实现释放囚犯算法时函数返回None原因排查

问题原因
  • 递归调用未返回结果:你在len(prison) != 0的两个分支中,仅执行了freed_prisoners(prison)递归调用,没有将递归返回的计数和当前层的释放数量相加后返回。Python函数如果没有显式写return语句,默认会返回None,这是你得到None的核心原因。
  • 业务逻辑不符合规则:题目明确要求如果当前最左侧单元格为锁定状态(值为0),直接无法释放任何人,你代码的else分支还在删除第一个元素继续递归,完全不符合题目逻辑。
修复方案

我们可以调整递归逻辑,每次处理完当前单元格后,将递归结果和当前计数相加返回,同时修正规则判断逻辑,优化翻转代码的写法,避免修改原列表产生副作用:

def freed_prisoners(prison):
    # 边界条件:没有剩余单元格直接返回0
    if not prison:
        return 0
    # 最左侧单元格锁定,无法释放任何人,直接返回0
    if prison[0] == 0:
        return 0
    # 释放当前单元格的囚犯,计数+1
    current_count = 1
    # 剩余单元格全部翻转,生成新列表(避免修改原列表)
    flipped_remaining = [1 - cell for cell in prison[1:]]
    # 递归处理剩余单元格,累加计数后返回
    return current_count + freed_prisoners(flipped_remaining)

print(freed_prisoners([1, 1, 0, 0, 0, 1, 0]))
# 输出结果为1

如果需要匹配你原有代码的写法风格,也可以在你原有代码的基础上最小修改:

def freed_prisoners(prison):
    prisoners_count = 0
    if prison[0] == 1:
        prisoners_count += 1
        del prison[0]
        if len(prison) != 0:
            for i in range(len(prison)):
                prison[i] = 1 - prison[i]
            # 加上return,返回当前计数+递归结果
            return prisoners_count + freed_prisoners(prison)
        else:
            return prisoners_count
    else:
        # 最左侧是0直接返回当前计数(0),不需要继续递归
        return prisoners_count

内容的提问来源于stack exchange,提问作者radu marin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:54:00