如何用Python Turtle绘制指定递归分形图形?求代码修正
问题描述
我尝试绘制如下图形:
但始终无法实现。我意识到该图形是由4个相同的子图形在正确位置重复构成的,以下是我目前的代码,求帮忙完成需求:
import turtle def draw_fractal(t, length, depth): if depth: for _ in range(4): t.forward(length) t.right(90) t.penup() t.forward(length / 2) t.right(90) t.forward(length / 2) t.left(90) t.pendown() # Draws smaller squares for _ in range(4): draw_fractal(t, length / 2, depth - 1) if _ < 3: t.penup() t.forward(length) t.right(90) t.pendown() t.penup() t.left(90) t.forward(length / 2) t.right(90) t.forward(length / 2) t.pendown() def main(): window = turtle.Screen() window.bgcolor("white") t = turtle.Turtle() t.speed(0) draw_fractal(t, 200, 3) window.mainloop() main()
修正方案
你的核心问题是子图形的定位逻辑错误:原代码将子正方形画在大正方形的中心区域,但目标图形的子正方形是在每个大正方形边的外侧中点位置。以下是修正后的代码:
import turtle def draw_fractal(t, length, depth): if depth == 0: return # 绘制当前层级的正方形 for _ in range(4): t.forward(length) t.right(90) # 遍历四条边,在每条边的外侧中点绘制子正方形 for _ in range(4): # 移动到当前边的中点 t.penup() t.forward(length / 2) t.pendown() # 转向外侧,递归绘制子图形 t.right(90) draw_fractal(t, length / 2, depth - 1) t.left(90) # 移动到下一条边的起点 t.penup() t.forward(length / 2) t.right(90) t.pendown() def main(): window = turtle.Screen() window.bgcolor("white") t = turtle.Turtle() t.speed(0) # 调整初始位置到屏幕中心区域,避免图形偏移出可视范围 t.penup() t.goto(-100, 100) t.pendown() draw_fractal(t, 200, 3) window.mainloop() main()
关键修改说明
- 子图形定位逻辑:放弃中心定位,改为每条边中点外侧绘制子正方形,完全匹配目标图形的结构
- 递归终止条件:明确
depth == 0时返回,逻辑更清晰严谨 - 初始位置调整:将海龟初始位置移到屏幕左上角区域,确保完整显示整个分形图形
内容的提问来源于stack exchange,提问作者GratefullyDead
相关产品推荐
相关产品推荐

