繁体   English   中英

用 Python 生成方形分形

[英]Generating square fractals with Python

我需要编写一个递归函数,以 level 作为参数来生成方形分形。 每个正方形必须在 3 个角上有一个正方形。

它应该是什么样子,1、2、3、4 级它应该是什么样子,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM