栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

谢尔宾斯基三角形——python递归

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

谢尔宾斯基三角形——python递归

一、 问题描述

类似于分形树,分形三角形——谢尔宾斯基三角形同样是一种分形,由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585。对于谢尔宾斯基三角形的构造,可以先作一个正三角形,挖去一个“中心三角形”(即以原三角形各边的中点为顶点的三角形),然后在剩下的小三角形中又挖去一个“中心三角形”,我们用黑色三角形代表挖去的面积,那么白三角形为剩下的面积(我们称白三角形为谢尔宾斯基三角形)。如果用上面的方法无限连续地作下去,则谢尔宾斯基三角形的面积越趋近于零,而它的周长越趋近于无限大。

二、问题分析

在分形树——python递归中,因为分形图形每个部分都具有相同形状,因而我们从最基本的情况开始考虑。

这里,我们先定义try_1(),用turtle按第一个图案所示顺序画出“度”为1的三角形;接着定义tri_2(),即在三个正放的小三角形顶点处调用tri_1();同理定义tri_3()。我们很容易的可以想到递推关系——在“度”为n的三个正放的小三角形顶点处调用函数tri_n-1(),于是便可以画出图示谢尔宾斯基三角形。

三、算法设计
import turtle

t = turtle

tri_1()、tri_2()、tri_3()

def tri_1(sd_le=200):	# se_le = side lenth 表示边长
	"""图示顺序画出三角形"""
    t.right(120)
    t.forward(sd_le / 2)
    t.left(120)
    t.forward(sd_le / 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.left(120)
    t.forward(sd_le / 2)
    t.left(120)
    t.forward(sd_le)
    t.left(120)
    t.forward(sd_le)
    t.right(120)


def tri_2(sd_le=200):	
	"""画出'度'为2的三角形"""
    tri_1(sd_le // 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.left(120)
    tri_1(sd_le // 2)	# 调用tri_1()
    t.forward(sd_le / 2)
    tri_1(sd_le // 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.left(120)
    t.forward(sd_le / 2)
    t.left(120)
    t.forward(sd_le)
    t.left(120)
    t.forward(sd_le)
    t.right(120)


def tri_3(sd_le=200):
	"""画出'度'为3的三角形"""
    tri_2(sd_le // 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.left(120)
    tri_2(sd_le // 2)	# 调用tri_2()
    t.forward(sd_le / 2)
    tri_2(sd_le // 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.right(120)
    t.forward(sd_le / 2)
    t.left(120)
    t.forward(sd_le / 2)
    t.left(120)
    t.forward(sd_le)
    t.left(120)
    t.forward(sd_le)
    t.right(120)

tri()

def tri(n, sd_le=200):	# se_le = side lenth 表示边长
    if n == 1:
        t.width(de * 7)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le / 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le)
        t.left(120)
        t.forward(sd_le)
        t.right(120)
    else:
        t.width(de * 7)
        tri(n - 1, sd_le // 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        tri(n - 1, sd_le // 2)
        t.forward(sd_le / 2)
        tri(n - 1, sd_le // 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le)
        t.left(120)
        t.forward(sd_le)
        t.right(120)

和分形树一样,分形三角形的最内层实际上并没有下一层,于是最内层的调用和else下的方法相同,tri()可以优化为:

def tri(n, sd_le=600):	# se_le = side lenth 表示边长
    if n > 0:
        tri(n - 1, sd_le // 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        tri(n - 1, sd_le // 2)
        t.forward(sd_le / 2)
        tri(n - 1, sd_le // 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le)
        t.left(120)
        t.forward(sd_le)
        t.right(120)
    else:
        pass
四、完整代码
import turtle

t = turtle
t.hideturtle()
t.speed(999)
t.color('grey')
t.width(3)
t.penup()
t.goto(0, 300)
t.pendown()


def tri(n, sd_le=600):
    if n > 0:
        tri(n - 1, sd_le // 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        tri(n - 1, sd_le // 2)
        t.forward(sd_le / 2)
        tri(n - 1, sd_le // 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.right(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le / 2)
        t.left(120)
        t.forward(sd_le)
        t.left(120)
        t.forward(sd_le)
        t.right(120)
    else:
        pass

tri(5)
t.done()
五、运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923447.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号