分形树——python递归
一、问题描述
分形通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”。分形树则顾名思义——亦即理论上无论放大多少倍,都具有相同形状。
(以下图形均由turtle库绘制)
二、问题分析
因为分形树每个部分都具有相同形状,因而我们可以从最基本的情况开始考虑,亦即当树只有一层分枝时。可以定义一个函数tree_1(),用turtle画出一层分枝的树并回到树根处。于是可以很显然的想到两层分枝时的绘制,可以定义一个函数tree_2(),在第一次的分枝末段调用tree_1()来画出第二层分枝。同理可以定义tree_3(),同时在第一次分枝末段调用tree_2()来画出第二、三层分枝。于是每画到倒数第n层树枝末段时,调用函数tree_n-1(),直到n = 1。由此易知定义tree(n),通过递归实现分形树的绘制。
三、算法设计
import turtlet = turtle
tree_1()、tree_2()、tree_3()
def tree_1(lent=15):"""绘制一层分枝分形树"""t.forward(lent + 20) # 树干比树枝长20t.right(30)t.forward(lent)t.backward(lent)t.left(60)t.forward(lent)t.backward(lent)t.right(30)t.backward(lent + 20) # 回到树根处def tree_2(lent=55):"""绘制两层分枝分形树"""t.forward(lent + 20)t.right(30)tree_1() # 末段调用一层分形树的绘制t.left(60)tree_1() # 再次调用t.right(30)t.backward(lent + 20) # 回到树根处def tree_3(lent=75):"""绘制三层分枝分形树"""t.forward(lent + 20)t.right(30)tree_2() # 末段调用两层分形树的绘制t.left(60)tree_2() # 再次调用t.right(30)t.backward(lent + 20) # 回到树根处
tree()
def tree(lent):"""递归绘制分形树"""if lent == 15: # 直到下一层为一层分枝分形树t.forward(lent + 20)t.right(30)t.forward(lent)t.backward(lent)t.left(60)t.forward(lent)t.backward(lent)t.right(30)t.backward(lent + 20)else:t.forward(lent + 20)t.right(30)tree(lent) # 调用倒数下一层树的绘制t.left(60)tree(lent) # 再次调用t.right(30)t.backward(lent + 20)
然而对于上述tree()函数,最顶层分枝实际上并没有画出下一层分枝(理论上有),再注意到,当tree(lent)不被调用时,该层分枝满足else下的方法,于是可以对tree()函数进行优化,同时将角度ang,主树干长度,树枝树干长度差均设为参数。
def tree(lent, ang=30, dif=20):"""递归绘制分形树"""if lent > 0:t.forward(lent)t.right(ang)tree(lent - dif)t.left(2 * ang)tree(lent - dif)t.right(ang)t.backward(lent)else:print("done")
四、完整程序
import turtle
import randomt = turtle
t.color('brown')
t.left(90)
t.penup()
t.goto(0, -300)
t.pendown()
t.speed(999)def tree(lent, dif=15):"""递归绘制分形树"""ang = random.randint(18, 36) # 随机角度使树更加真实if lent > 0:t.width(lent//10)t.forward(lent)t.right(ang)tree(lent - dif)t.left(2 * ang)tree(lent - dif + 8)if lent - dif <= 0:t.color('pink')t.dot(20)t.color('brown')t.right(ang)t.backward(lent)else:passtree(120)
t.done()
五、运行结果
分形树——python递归相关推荐
- Python Turtle画分形树理解递归
递归思想 递归可以把一个复杂问题转化为一个与原问题相似的规模较小的问题,通过自己调用自己,找到最终解决这个问题的条件,达到判断条件时返回. 通过分形树理解递归 Python中的 turtle画图很方便 ...
- 第11章 递归分形树(《Python趣味创意编程》教学视频)
(图书介绍:童晶:<Python趣味创意编程>新书预告) 本章我们将绘制递归分形树,如图所示.首先学习递归的概念,并学习if-elif-else语句:接着学习分形的概念,并利用递归调用绘制 ...
- Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形
1. Python中的turtle模块制图 前面已经讲了递归的原理,这里用递归作图来直观的理解递归. 首先了解以下Python中用于作图的内置海龟作图系统turtle module. Python内置 ...
- Python小例子——利用递归绘制分形树
# -*- coding: utf-8 -*- """作者:宇轩亚40功能:利用递归绘制分形树 """ import turtledef d ...
- python递归绘制简单分形树
对于树形结构,首先要明白绘制的过程: 1 绘制右数 2 返回节点 3 绘制左树 4 返回节点 代码: """ 作者:sust_ly 功能:绘制分形树 版本:2.0 日期: ...
- 实践 - 使用Python画一棵递归分形树
本实践中,作者要介绍用Python在Tkinter上画一棵树的方法.通过本实践,读者可以:练习面向对象的程序设计方法:了解生成器的使用方法:运用递归函数:了解Tkinter画图的基本方法:以及学习&q ...
- Python递归绘制分形树
递归函数绘制分形树 分形几何学的基本思想:客观事物具有自相似性的层次结构,局部和整体在形态,功能,信息,时间,空间等方面具有统计意义上的相似性,称为自相似性,自相似性是指局部是整体成比例缩小的性质. ...
- python 递归树
递归可以用来描述分形.分形常用来描述自然界中许多不规范的.真实对象的数字图形. 递归的图形还能说明递归是如何工作的.以递归绘制图树为例,绘制树枝的过程如下:首先绘制一条直线,然后左转,绘图(递归分支) ...
- python用turtle画月亮_使用Python turtle画表白分形树
原标题:使用Python turtle画表白分形树 turtle --- 海龟绘图 海龟绘图很适合用来引导孩子学习编程.最初来自于 Wally Feurzig 和 Seymour Papert 于 1 ...
最新文章
- 华为鸿蒙智慧屏怎么样,65寸华为智慧屏怎么样?4000元选哪个好?
- mysql 严格模式查看,如何查找和禁用MySQL严格模式?
- 剑指offer——01二维数组中的查找.
- CVPR2014: DeepID解读
- 10-angular.identity
- python是什么类型的编程语言-python和scratch有什么区别
- 字典:python的基础数据类型
- 2、Zookeeper集群搭建、命令行Client操作
- cownew开源-cownewStudio抢先预览
- 数字电子技术基础(九):竞争—冒险现象成因及消除
- macOS如何格式化移动硬盘和U盘
- 导向滤波与opencv python实现
- 一个完整的计算机系统有哪五大组成部分,一个完整的计算机系统由哪些部份组成...
- HTML文件mhl,比HDMI更强!MHL与HDMI技术解析
- latex 矩阵分块(block matrix)
- 对于美国中部覆盖图防护林形态的自动检测技术
- 一个人能够哲学思考的条件
- 基于 Gin 的会议室预约 API 设计 (二)
- phpcms选择文件无法加载插件怎么办_win7浏览器显示无法加载插件的两种修复方法...
- 使用Makefile链接so库文件
热门文章
- 中概股回归难逆袭 陌陌私有化就遇到了失败风险
- 牛根生VS史玉柱:举重若轻俩巨人 千金散尽还复来(zz)
- 「更新方法」iOS16.4更新方法及固件下载
- 同等情况下计算机执行什么速度最快,显存速度是什么 内存和显存哪个更能影响电脑运行速度...
- 【JZOJ4637】大鱼海棠
- I/O提升50%,长江存储发布PCIe4.0固态硬盘致态TiPlus7100
- sps忘记保存文档怎么恢复_苹果手机锁屏密码忘了怎么办?在家也能搞定,赶紧收藏!...
- C语言5个水手分椰子
- Linux通过docker安装运行酷Q--用QQ骰子君进行跑团
- Windows开启winrm服务