类似于分形树,分形三角形——谢尔宾斯基三角形同样是一种分形,由波兰数学家谢尔宾斯基在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()
五、运行结果



