我想生成一个递归模式
然而,我对分形函数做什么以及如何编写该函数以获得我想要的输出非常无能。
——代码
from turtle import Turtle, Screen
import math
t = Turtle()
s = Screen()
t.speed(0)
def square(x, y, side):
t.setpos(x,y)
for i in range(4):
t.forward(side)
t.right(90)
def tiltsquare(x, y, side):
t.left(45)
square(x, y, side)
def squareinsquare(x, y, side):
square(x, y, side)
half = side / 2
b = math.sqrt(half**2 + half**2)
tiltsquare(x, y - side/2, b)
squareinsquare(0, 0, 200)
s.exitonclick()
循环模式如下:
- 从当前点画一个正方形
- 移动第一个边的一半,然后旋转45°:这是下一个小正方形开始的位置
- 将当前大小除以√2,这将是下一个正方形的大小,因此它将嵌入当前正方形。
- 从头开始重复
所以,我会删除x
和y
参数的square
函数:它应该只是开始使用当前的位置和方向。
def square(side):
for i in range(4):
t.forward(side)
t.right(90)
def fractal(x, y, stSide, k):
t.setpos(x, y)
for i in range(k):
square(stSide)
t.forward(stSide / 2)
t.right(45)
stSide /= math.sqrt(2)
fractal(0, 0, 200, 10)
如果您不应该更改原始的square
函数,那么只需读取海龟的位置并将其作为参数传递给square
,然后它将对setpos()
进行不必要的调用:
def square(x, y, side):
t.setpos(x, y)
for i in range(4):
t.forward(side)
t.right(90)
def fractal(x, y, stSide, k):
t.setpos(x, y)
for i in range(k):
square(*t.pos(), stSide)
t.forward(stSide / 2)
t.right(45)
stSide /= math.sqrt(2)
fractal(0, 0, 200, 5)
我不知道分形,但这可以通过一个递归函数来实现,它绘制一个正方形,然后在一边移动一半,旋转45%,递归的大小是刚刚绘制的正方形对角线的一半。
import turtle as tg
def squares(n,side=200):
if not n: return # nesting done, end recursion
for _ in range(4): # draw square
tg.forward(side)
tg.left(90)
tg.forward(side/2) # move half way through side
tg.left(45) # turn 45%
squares(n-1,side*2**0.5/2) # recurse with half diagonal: side * √2 / 2
squares(10)
你也可以通过反转中间的移动和旋转来让它从内到外绘制:
def squares(n,side=10):
if not n: return # nesting done, end recursion
tg.right(45) # turn 45%
tg.backward(side/2) # move back to starting corner
for _ in range(4): # draw square
tg.forward(side)
tg.left(90)
squares(n-1,side*2**0.5) # recurse with larger size