如何解决Python骰子游戏运行时出现的最大递归深度超限错误
迷你骰子游戏RecursionError崩溃问题修复
问题原因
- 递归深度超出Python限制:代码通过递归调用
roll()实现重掷逻辑,Python默认递归深度上限为1000,当连续多次掷出无重复骰子结果时,调用栈层数超过上限就会触发RecursionError。 - 逻辑设计缺陷:嵌套的
check()函数中while循环未修改当前作用域的result变量,仅递归调用roll(),当前层级的循环永远不会退出,调用栈会持续累积不会释放,加速栈溢出发生。
修复方案
将递归逻辑替换为单层循环实现,从根本上避免栈溢出问题,优化后代码如下:
import random def roll(): # 所有无重复的5个骰子排序结果 unique_results = [ [1,2,3,4,5], [1,2,3,4,6], [1,2,3,5,6], [1,2,4,5,6], [1,3,4,5,6], [2,3,4,5,6] ] while True: result = sorted([random.randint(1,6) for _ in range(5)]) if result not in unique_results: print(result) return roll()
优化说明
- 采用单层
while循环实现重掷逻辑,所有操作在同一函数栈层级完成,不会出现调用栈溢出问题 - 提前定义所有无重复的结果集,用
in关键字判断替代冗长的多or条件,代码可读性和可维护性更高 - 简化了冗余的嵌套函数定义,降低不必要的性能开销
内容的提问来源于stack exchange,提问作者Isaac Chew
相关产品推荐
相关产品推荐

