Python Turtle绘制谢尔宾斯基三角形时递归深度超限崩溃问题
问题原因分析
报错的核心原因是execute函数的递归实现触发了Python的递归深度限制。Python默认递归深度上限约为1000,当指令字符串长度超过这个值时,递归调用execute的次数会超出限制,从而抛出RecursionError。
解决方案
方案1:将递归执行改为迭代执行
把递归遍历指令的逻辑改成循环迭代,彻底规避递归深度限制问题:
def execute(commands: str) -> None: for cmd in commands: if cmd == 'f': t.fd(20) elif cmd == 'l': t.lt(60) elif cmd == 'r': t.rt(60)
这个版本通过for循环逐个处理指令字符,没有递归调用,无论指令字符串多长都能正常执行。
方案2:直接递归绘制(更高效)
当前先生成超长指令字符串再执行的思路,不仅会占用大量内存,还可能在n值更大时出现字符串溢出问题。可以跳过生成指令的步骤,直接递归绘制谢尔宾斯基三角形,内存和执行效率都会显著提升:
import turtle t = turtle.Turtle() t.speed('fastest') t.penup() t.goto(-200, -150) # 调整初始位置让图形居中 t.pendown() def draw_sierpinski(n: int, length: int) -> None: if n == 0: # 绘制基础等边三角形 for _ in range(3): t.fd(length) t.lt(120) else: # 递归绘制三个子三角形 draw_sierpinski(n-1, length // 2) t.fd(length // 2) draw_sierpinski(n-1, length // 2) t.bk(length // 2) t.lt(60) t.fd(length // 2) t.rt(60) draw_sierpinski(n-1, length // 2) # 回到当前层级的起始位置 t.lt(60) t.bk(length // 2) t.rt(60) # 调用示例:n=5,初始边长400 draw_sierpinski(5, 400) turtle.done()
这个方法直接通过递归调用绘制图形,不需要存储海量指令字符串,且递归深度仅与n值相关(n=10时递归深度也只有10),远低于Python的递归限制。
内容的提问来源于stack exchange,提问作者shan
相关产品推荐
相关产品推荐

