递归三部曲:

〇、介绍递归及三原则

一、谢尔宾斯基三角形

二、汉诺塔

三、迷宫探索

1、谢尔宾斯基三角形

本教程为本人在b站投稿的视频教程对应的文字版
视频较详细,文本较简洁,大家选择一个看就好

谢尔宾斯基三角形(Sierpinski triangle),
是一种如图所示的分形
点击观看谢尔宾斯基三角形绘制动画(Sierpinski Triangle)

这里分析一下其绘制过程
1、绘制一个三角形
2、取三角形的三边中点,
以每两个中点及其所在边共有的顶点,
三个一组,组合成三个小三角形,
对三个三角形进行绘制,
如下图所示,分别为ADF,DBE,FEC。
3、对2中的三个小三角形,重复步骤2。

理论上,步骤二可以无限重复下去,但是代码而言,要保证算法的有穷性,所以一般都是将步骤二运行有限次数之后结束。

2、结合递归三原则编写代码

首先,需要添加方法draw_sierpinski来绘制指定层数的谢尔宾斯基三角形

def draw_sierpinski(triangle,depth):"""绘制指定层数的谢尔宾斯基三角形triangle: 指定三角形三个顶点坐标,示例:((ax,ay),(bx,by),(cx,cy))。depth: 指定层数"""

这里再解释下depth这个层数的具体意思,即上面的步骤二执行的次数
那么下图从左到右,层数分别为:0,1,2,3,4

然后我们再分析下draw_sierpinski方法应该怎么写
1,绘制三角形triangle
2,如果层数depth为0则退出递归
3,取三角形中点,及对应形成的三个小三角形,
4,对这三个三角形,分别再次调用draw_sierpinski方法,
绘制depth-1的谢尔宾斯基三角形
为了实现上面四步,我们需要添加两个辅助方法
get_midpoint(a,b) : 返回a,b两点的中点坐标
draw_triangle(a,b,c) : 以a,b,c为顶点绘制三角形
最终代码如下

#!/usr/bin/python3
import turtlet = turtle.Turtle()def get_midpoint(a, b):ax, ay = abx, by = breturn (ax + bx) / 2, (ay + by) / 2def draw_triangle(a, b, c):ax, ay = abx, by = bcx, cy = ct.penup()t.goto(ax, ay)t.pendown()t.goto(bx, by)t.goto(cx, cy)t.goto(ax, ay)t.penup()def draw_sierpinski(triangle, depth):""":param triangle: 指定三角形三个顶点坐标,示例:((ax,ay),(bx,by),(cx,cy))。:param depth: 指定层数"""a, b, c = triangledraw_triangle(a, b, c)if depth == 0:returnelse:d = get_midpoint(a, b)e = get_midpoint(b, c)f = get_midpoint(c, a)draw_sierpinski([a, d, f], depth-1)draw_sierpinski([d, b, e], depth-1)draw_sierpinski([f, e, c], depth-1)if __name__ == '__main__':triangle = [[-200, -100], [0, 200], [200, -100]]draw_sierpinski(triangle, 5)turtle.done()

运行效果如图

然后我们结合代码回顾一下递归三原则
如图所示:

这里补充一点,递归三原则的2和三常常是一起进行的,
即在向1中的基础情况靠拢的的情况下调用递归方法本身

3、最后补充:

问题1:没有颜色的变化
本人在b站的关于这个谢尔宾斯基三角形视频教程最终代码如步骤二中所示,但是有个小小的细节问题,就是不同层数的三角形之间没有颜色的变化,与本文开头的图一不符。所以最后还是要添加一下颜色的处理
问题2:最终运行结束后中间有黑点
大家看步骤二重最后运行效果图,中间有个黑点, 这个黑点是turtle画笔对象,一般是箭头样式,放在中间破坏了整个画面,隐藏掉就好了
解决问题一二后代码如下

#!/usr/bin/python3
import turtlet = turtle.Turtle()
t.hideturtle()
FillColors=['#CAE1FF','#FFEFDB','#8470FF','#FF6347','#FFDEAD','#C1FFC1'
]def get_midpoint(a, b):ax, ay = abx, by = breturn (ax + bx) / 2, (ay + by) / 2def draw_triangle(a, b, c, depth):ax, ay = abx, by = bcx, cy = ct.penup()_tcolor = FillColors[depth % len(FillColors)]t.color("black", _tcolor)t.goto(ax, ay)t.pendown()t.begin_fill()t.goto(bx, by)t.goto(cx, cy)t.goto(ax, ay)t.end_fill()t.penup()def draw_sierpinski(triangle, depth):""":param triangle: 指定三角形三个顶点坐标,示例:((ax,ay),(bx,by),(cx,cy))。:param depth: 指定层数"""a, b, c = triangledraw_triangle(a, b, c, depth)if depth == 0:returnelse:d = get_midpoint(a, b)e = get_midpoint(b, c)f = get_midpoint(c, a)draw_sierpinski([a, d, f], depth-1)draw_sierpinski([d, b, e], depth-1)draw_sierpinski([f, e, c], depth-1)if __name__ == '__main__':triangle = [[-200, -100], [0, 200], [200, -100]]draw_sierpinski(triangle, 5)turtle.done()

此时运行效果如图

问题3:线条重画导致粗细不一
如果有朋友观察细致的话,会发现一些边线有时有粗细不一的情况。

这是由于每次重复绘制过程的第二步时,边线也被重复绘制了,但是重复绘制有时候并不一定和原来的边线是齐的,这种反复不齐导致整个线条实际上是有多个不完全一致的线段叠起来的,所以看上去会有粗有细。

实际上,步骤二为了让大家简单直接的理解递归,所以选择了重复绘制边线这种方便递归的方法来画谢尔宾斯基三角形,方便的缺点就是重画边线导致不齐的线段叠加,当然这个缺点对于初学者完全可以忽略。

如果我们要解决这个问题,实际上就需要调整我们的绘制过程,修改原来绘制过程中的步骤二,不过这会使递归略微麻烦一点点。
具体的可看我以前博客园写的文章,这篇文章里就用的是另外一种绘制过程,来避免了重复画线:https://www.cnblogs.com/BigShuang/p/10837020.html
我就不搬运过来了。

本文主要通过三个实例来帮助大家理解递归(其展示动画已上传B站):
谢尔宾斯基三角形(Sierpinski Triangle)
汉诺塔(Tower of Hanoi)
迷宫探索(Maze Exploring)
本文代码已上传到github:https://github.com/BigShuang/recursion-with-turtle
本文参考文献:
Problem Solving with Algorithms and Data Structures using Python
turtle官方文档:
中文:https://docs.python.org/zh-cn/3.6/library/turtle.html
英文:https://docs.python.org/3.6/library/turtle.html

【教程】python递归三部曲(基于turtle实现可视化)-一、谢尔宾斯基三角形相关推荐

  1. 数据结构与算法(Python版)二十二:递归可视化(谢尔宾斯基三角形)

    谢尔宾斯基Sierpinski三角形 分形构造, 平面称谢尔宾斯基三角形, 立体称谢尔宾斯基金字塔 谢尔宾斯基三角形:作图思路 根据自相似特性, 谢尔宾斯基三角形是由3个尺寸减半的谢尔宾斯基三角形按照 ...

  2. python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...

    插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进.后退.左转.右转,乌龟的尾巴朝下,它移动时就会画一条线.并且为了增加乌龟 ...

  3. turtle库使用教程 及 绘制 浪漫樱花 五角星 彩虹玫瑰 谢尔宾斯基三角形 实例

    目录 一.turtle简介 二.绘图坐标体系 三.笔画控制函数 四.形状绘制函数 五.颜色填充 六.浪漫樱花代码实例 七.五角星代码实例 八.彩虹玫瑰代码实例 九.谢尔宾斯基三角形代码实例 一.tur ...

  4. Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形

    1. Python中的turtle模块制图 前面已经讲了递归的原理,这里用递归作图来直观的理解递归. 首先了解以下Python中用于作图的内置海龟作图系统turtle module. Python内置 ...

  5. 学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

      科赫曲线和谢尔宾斯基三角形是常见的分形图形(详细介绍见参考文献1),本文使用turtle库绘制这两类图形. 科赫曲线   科赫曲线的详细介绍见参考文献2,其中的绘图思路是"画正三角形,并 ...

  6. Python实验舱谢尔宾斯基三角形绘制教程

    三角形,大家应该再熟悉不过了. 上图是一个由四个小三角形拼成的大三角形,也叫谢尔宾斯基三角形. 谢尔宾斯基三角形还能继续画下去: 2阶(上图是1阶): 3阶: 5阶: 8阶: (小编奉劝一句:不要试图 ...

  7. 小白第一步|Java实现递归分形(以谢尔宾斯基三角形和勾股树为例)

    一个递归分形搞得我心态爆炸 于是 我一定要写个博客祭奠一下!!!!!! 首先回顾一下递归的几个要素: 1.return:往上回溯 2.调用自身:往下挖掘 3.设置条件:防止无限递归 4.递归操作:分析 ...

  8. 陈斌老师《数据结构与算法Python版》第五周作业——ASCII谢尔宾斯基地毯

    陈斌老师<数据结构与算法Python版>第五周作业--ASCII谢尔宾斯基地毯 题目 思路 程序如下 总结 题目 谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中 ...

  9. Java面向对象编程:利用递归思想绘制“谢尔宾斯基地毯”和“谢尔宾斯基三角形”

    1.递归:在方法中调用本方法. 2.递归调用会无限循环下去,因此方法体中必须有结束方法的条件.返回值为void时通常写为: if (条件) {return; } 下面使用递归绘制"谢尔宾斯基 ...

  10. python递归三角形_python 谢尔宾斯基三角形的递归实现

    import turtle def draw(points): # 根据三个坐标,画一个三角形 t.penup() t.goto(points['left']) t.pendown() t.goto( ...

最新文章

  1. python scale 窗口部件 使用_Tkinter介绍及教学-Python教学【StudyQuant-Python量化投资课堂】...
  2. 大学计算机实验教程实验报告2.2,大学计算机实验2-实验报告.pdf
  3. python 自动化-Python 接口自动化测试
  4. SpringBoot框架与MyBatis集成,连接Mysql数据库
  5. socket 编程的端口和地址复用
  6. Hadoop数据压缩 与 数据清洗ETL
  7. vue中获取输入框中得到值_如何获取vue input的值
  8. LeetCode算法题-Delete Node in a Linked List(Java实现)
  9. How Google Tests Software (出书,停止更新)
  10. JS基础知识 --变量类型和计算
  11. iphone6s维修定位服务器,iphone6s修理点
  12. 网络安全年终盘点:2018年数据泄露事件回顾
  13. 若依框架(Ruoyi-vue)上传视频且回显
  14. 报错Field Mapper in xxx.xxxServiceImpl required a bean of type ‘dao.xxxMapper‘ that could not be found
  15. SYBASE 12.5 维护手册 3. 技术专刊
  16. 搭建个人内网穿透服务
  17. 什么是框架?常用框架有哪些?
  18. #define 定义常量和宏,指针和结构体
  19. H3C R390 G2 服务器重装系统
  20. 【镜像取证篇】DD和E01镜像格式区别(简)

热门文章

  1. hmssdk php,接入华为推送,开发流程, 与遇到的坑(PUSH SDK 和 HMS SDK)
  2. 安卓原生系统_体验类原生安卓系统PixelExperience流畅得不像话
  3. 【机器学习】朴素贝叶斯算法及其实现
  4. Excel VBA 代码加密
  5. matlab中各种数据类型及转换
  6. 软件设计师中级-UML建模
  7. 一文搞懂Matlab的3种取整函数(round、ceil、floor)
  8. ios版的chrome如何保存网页为PDF
  9. T1-商贸宝服务无法启动解决办法
  10. u8转完看不到菜单_进入软件后所有菜单栏都不显示