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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:27:28