1 思路
海龟图画谢尔宾斯基地毯思路:令最小的一个正方形边长为base,则n阶地毯的边长为base*(3**n)
由于turtle画布的长度为600左右,第一象限长度为300左右,我们令base=int(300/(3^n)
判断每一个边长为base的小正方形是否应该挖去
2 Python turtle 程序
import turtle
from numpy import true_divide
n = int(input())
t = turtle.Turtle()
base = int(300 / (3 ** n)) # 设置每个小正方形长度base
length = base * (3 ** n) # 最外围的正方形长度
t.pensize(0.1)
t.hideturtle()
turtle.tracer(True) # 画图过程太长我们跳过不看
t.speed(0)
t.pencolor('blue')
t.fillcolor('blue')
t.begin_fill() # 填充蓝色
for i in range(1, 5):
t.forward(length)
t.left(90)
t.end_fill()
def carpet(N): # 对于点a(x,y),我们令a点位小正方形的左下角顶点
def check(n, x, y):
if n <= base: # 结束条件
return True
n2 = n // 3
if n2 <= x < n2 * 2 and n2 <= y < n2 * 2: # 小正方形处于大正方形中央应该满足的条件
return False
return check(n2, x % n2, y % n2) # 不处于中央的点,递归至下一层的小正方形
for y in range(0, N, base):
for x in range(0, N, base):
if check(N, x, y):
continue
else: # 将(x,y)处小正方形填为空白
t.penup()
t.setx(x)
t.sety(y)
t.pendown()
t.pensize(0.1)
t.pencolor('white')
t.fillcolor('white')
t.begin_fill()
for i in range(1, 5):
t.forward(base)
t.left(90)
t.end_fill()
t.penup()
carpet(length)
turtle.done()
3 效果