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
相关产品推荐
相关产品推荐

