【问题标题】:Generating square fractals with Python使用 Python 生成方形分形
【发布时间】:2020-03-19 09:37:04
【问题描述】:

我需要编写一个以 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)

输出:

【问题讨论】:

标签: python recursion turtle-graphics fractals


【解决方案1】:

您需要在某处中断代码,以便它可以返回到起点。在您的代码中,海龟在绘制正方形后会继续转动,对于三个角,您需要将其转动两次。检查下面的代码。它给出了预期的输出。

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)

【讨论】:

  • 你可能是对的,但你给了他一个解决方案,却没有教他任何东西。那不是这样,所以我投反对票。
  • 代码和他已经写的一样。关于我所做的修改,我在答案中已经有理由地提到了它们。我可能没有很好地解释它们。从现在开始,我将尝试更具描述性。谢谢你让我知道我的差距。 :)
  • @FilipMalczak 他确实解释了问题所在并提供了解决方案。那就是这样。我知道你在说什么。来自我的 UPVOTE。
  • @HNMN3 非常感谢您的帮助。谢谢!
【解决方案2】:

为了实现其目标,此代码过于复杂。我看到了两个原因:首先,您的 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()

问题是我必须编写一个递归函数,它只能 使用级别作为参数,仅此而已。这就是为什么我有长度作为 全局变量。

我们可以降低代码质量以实现您新提出的目标。

请注意,如果没有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()

【讨论】:

  • 非常感谢您的帮助。我知道这可以像那样更容易完成,但问题是我必须编写一个只能使用 level 作为参数的递归函数,没有别的。这就是为什么我将长度作为全局变量。
  • @thomaso,我已经相应地调整了我的示例。尽管从长远来看,了解为什么全局变量会成为障碍很重要。
  • 谢谢!是的,我明白了,有道理。不幸的是,我必须做一个作业,它需要这样的解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多