[英]Generating square fractals with Python
我需要编写一个递归函数,以 level 作为参数来生成方形分形。 每个正方形必须在 3 个角上有一个正方形。
它应该是什么样子,1、2、3、4 级 .
我试过一些东西,但我被卡住了。 我完成了第一部分,但后来卡在了循环中,我不知道如何继续。
这是我的代码的样子:
from turtle import *
def fractal(level):
global length
if level == 1:
forward(length)
right(90); forward(length)
right(90); forward(length)
right(90); forward(length)
return
else:
forward(length)
length = (length / 2)
fractal(level - 1)
length = length * 2
fractal(level)
length = 100
fractal(4)
输出:
这段代码对于实现其目标来说过于复杂。 我认为有两个原因:首先你的length
全局使事情复杂化并使代码不可重入(考虑在两个线程上同时运行此函数的两个海龟。)我们需要将length
作为参数。 其次,大多数不熟悉递归的人会过度思考问题,并且不让递归为他们做工作。 我会按如下方式重组:
from turtle import Screen, Turtle
def fractal(level, turtle, length, direction=90):
for _ in range(3):
turtle.forward(length)
if level > 1:
fractal(level - 1, turtle, length / 2, -direction)
turtle.right(direction)
turtle.forward(length)
turtle.right(direction)
screen = Screen()
turtle = Turtle()
turtle.speed('fastest') # because I have no patience
fractal(4, turtle, 100)
turtle.hideturtle()
screen.exitonclick()
问题是我必须编写一个只能使用 level 作为参数的递归函数,没有别的。 这就是为什么我将长度作为全局变量。
我们可以降低代码质量以实现您新设定的目标。
请注意, if
没有if
语句,两个程序都只绘制一个正方形,即分形的基础。 是if
语句引入了递归和使图像变小并最终结束递归的修改:
from turtle import *
def fractal(level):
global length, direction
for _ in range(3):
forward(length)
if level > 1:
length /= 2
direction = - direction
fractal(level - 1)
direction = - direction
length *= 2
right(direction)
forward(length)
right(direction)
length = 100
direction = 90
fractal(4)
hideturtle()
exitonclick()
您需要在某处破坏代码,以便它可以返回到起点。 在您的代码中,乌龟在绘制正方形后不断转动,对于三个角,您需要将其转动两次。 检查下面的代码。 它给出了预期的输出。
import turtle
def fractal(level, tob, turn_direction=2):
global length
if level == 1:
tob.forward(length)
tob.left(90)
tob.forward(length)
tob.left(90)
tob.forward(length)
tob.left(90)
tob.forward(length)
return
else:
tob.forward(length)
length /= 2
fractal(level - 1, tob)
length *= 2
if turn_direction == 0:
tob.forward(length)
return
fractal(level, tob, turn_direction=turn_direction - 1)
length = 100
wn = turtle.Screen()
wn.bgcolor("light green")
wn.title("Turtle")
tur_ob = turtle.Turtle()
fractal(4, tur_ob)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.