Python turtle模块递归绘图实战:螺旋、二叉树与谢尔宾斯基三角形

竹里
竹里
发布时间:2026-10-13| 6人浏览过
原创

本文详解如何利用Python内置turtle模块实现三种经典递归图形绘制。通过调整步长与旋转角度,演示螺旋线的生成逻辑;解析二叉树的分形递归结构及左右分支的角度补偿机制;深入剖析谢尔宾斯基三角形基于中点连接的三路递归算法。代码包含完整参数设置与颜色控制,适合Python图形编程初学者参考。

Turtle模块基础与绘图原理

Python内置的turtle模块提供了一种直观的绘图方式,其名称灵感来源于“乌龟”概念:想象一只背负画笔的乌龟,它具备前进、后退、左转和右转的能力。由于画笔始终接触纸面,乌龟的移动轨迹即为绘制的线条。为了提升绘图的艺术效果,用户可以自定义画笔的粗细以及墨水颜色,从而丰富图形的视觉表现。

递归绘制螺旋线

本节介绍如何使用递归算法绘制螺旋线。核心思路是控制乌龟以指定的长度line_len向前移动,随后向右旋转90度,接着缩短移动长度并递归调用绘制函数,直至满足终止条件。

具体实现中,首先设定初始线段长度line_len,乌龟执行forward(line_len)前进,接着通过right(90)向右旋转90度。随后,函数递归调用自身,传入缩短后的长度(line_len - 1),直到长度不大于0时停止递归,从而形成螺旋效果。


import turtle
my_turtle = turtle.Turtle()
my_win = turtle.Screen()
def draw_spiral(tur, line_len):
  if line_len > 0:
    my_turtle.forward(line_len)
    my_turtle.right(90)
    draw_spiral(tur, line_len - 1)
draw_spiral(my_turtle, 100)
my_win.exitonclick()

递归绘制二叉树

本节探讨递归绘制二叉树的实现方法。该方法通过模拟树枝的分叉过程,利用递归调用生成复杂的树形结构。

绘制过程首先绘制长度为branch_length的主干。接着,乌龟向右旋转20度,递归调用draw_tree绘制右侧分支。完成右分支后,向左旋转40度以抵消之前的右旋并调整至左侧方向,再次递归调用draw_tree绘制左分支。最后,向右旋转20度使方向归位,并通过backward(branch_length)原路返回,完成当前层级的绘制。


import turtle
my_tree = turtle.Turtle()
my_win = turtle.Screen()
def draw_tree(branch_length, t):
  if branch_length > 5:
    t.forward(branch_length)
    t.right(20)
    draw_tree(branch_length-20, t)
    t.left(40)
    draw_tree(branch_length-20, t)
    t.right(20)
    t.backward(branch_length)
my_tree.left(90)
my_tree.up() # 抬起尾巴
my_tree.backward(200)
my_tree.down() # 放下尾巴
my_tree.color('green')
draw_tree(100, my_tree)
my_win.exitonclick()

谢尔宾斯基三角形算法

本节讲解谢尔宾斯基三角形的绘制原理。这是一种基于分形几何的经典图形,通过递归细分三角形区域来构建。

谢尔宾斯基三角形采用三路递归策略。算法从一个大三角形开始,计算三条边的中点,连接中点将原三角形分割为四个小三角形。随后,忽略位于中心的那个小三角形,对其余三个角上的三角形重复上述分割与忽略操作,递归执行直至达到指定的深度。


import turtle
def draw_triangle(points, color, my_angle):
  my_angle.fillcolor(color)
  my_angle.up()
  my_angle.goto(points[0][0], points[0][1])
  my_angle.down()
  my_angle.begin_fill()
  my_angle.goto(points[1][0], points[1][1])
  my_angle.goto(points[2][0], points[2][1])
  my_angle.goto(points[0][0], points[0][1])
  my_angle.end_fill()
def get_mid(p1, p2):
  return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2)
def sierpinski(points, degree, my_angle):
  colormap = ['blue', 'red', 'green', 'yellow',
        'violet', 'orange', 'white']
  draw_triangle(points, colormap[degree], my_angle)
  if degree > 0:
    sierpinski([points[0],
          get_mid(points[0], points[1]),
          get_mid(points[0], points[2])],
          degree - 1, my_angle)
    sierpinski([points[1],
          get_mid(points[0], points[1]),
          get_mid(points[1], points[2])],
          degree - 1, my_angle)
    sierpinski([points[2],
          get_mid(points[2], points[1]),
          get_mid(points[0], points[2])],
          degree - 1, my_angle)
my_turtle = turtle.Turtle()
my_win = turtle.Screen()
my_points = [[-100, -50], [0, 100], [100, -50]]
sierpinski(my_points, 3, my_turtle)
my_win.exitonclick()

总结

上述内容介绍了利用Python turtle模块绘制螺旋线、二叉树及谢尔宾斯基三角形的递归实现方法,旨在为读者提供实用的图形编程参考。如有任何疑问或需要进一步的技术交流,欢迎留言讨论,我们将及时回复。感谢对本站的支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。