【问题标题】:Recursive H Trees using Turtle使用 Turtle 的递归 H 树
【发布时间】:2017-04-12 10:25:17
【问题描述】:

我正在尝试使用递归创建一个程序,该程序将创建一个像这样的 H 树(这是顺序 1): H tree

零阶 H-tree 只是一个以中心点为中心的 H,H 的所有三行都具有相同的线长 该函数将接收一个海龟对象、一个指示树顺序的整数、一个中心点和线的长度。如果阶数大于零,则将在步骤 1 中绘制的 H 的四个端点中的每一个的中心绘制四个阶数较小(阶数 -1)和长度较小的线(行长 / 2)的 H 树。

到目前为止,我有这个:

import turtle

def drawHTree(length, depth):
    if depth > 0:
        turtle.forward(length / 2)
        turtle.right(90)
        turtle.forward(length / 2)
        turtle.left(90)

        drawHTree(length / 2, depth - 1)

        turtle.left(90)
        turtle.forward(length)
        turtle.right(90)

        drawHTree(length / 2, depth - 1)

        turtle.right(90)
        turtle.forward(length / 2)
        turtle.right(90)
        turtle.forward(length)
        turtle.left(90)
        turtle.forward(length / 2)
        turtle.left(90)

        drawHTree(length / 2, depth - 1)

        turtle.left(90)
        turtle.forward(length)
        turtle.right(90)

        drawHTree(length / 2, depth - 1)

        turtle.right(90)
        turtle.forward(length / 2)
        turtle.left(90)
        turtle.forward(length / 2)

window = turtle.Screen()
drawHTree(200,2)

任何帮助或建议都会很棒!谢谢!

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。
  • 你说你熟悉turtle模块。您能向我们展示绘制零阶 H-tree 的代码吗?你能做到这一点,以便对于代码中某个位置的 H 的 4 个尖端中的每一个,乌龟都在那个尖端,并且与开始时的方向相同吗?你了解递归吗?把这些想清楚,你就差不多完成了。如果您仍然遇到困难,请向我们展示您的进度,尤其是到目前为止的代码,然后通过适当地编辑您的问题回复我们。

标签: python recursion drawing turtle-graphics


【解决方案1】:

如果您修复缩进,您上面的(原始)代码是正确的。你似乎有关键原则:首先让它画一个H;确保函数将海龟留在调用函数时的确切位置。以下是我对您的代码的修订,以解决一些样式问题,以获取深度/订单号以正确匹配所需的图纸并匹配规定的 API:

该函数将接收一个海龟对象,一个整数表示 树的顺序、中心点和线的长度

from turtle import Turtle, Screen

def drawHTree(turtle, order, center, length):

    if order < 0:
        return

    if center is not None:
        turtle.up()
        turtle.goto(center)
        turtle.down()

    turtle.forward(length / 2)
    turtle.right(90)
    turtle.forward(length / 2)
    turtle.left(90)

    drawHTree(turtle, order - 1, None, length / 2)

    turtle.left(90)
    turtle.forward(length)
    turtle.right(90)

    drawHTree(turtle, order - 1, None, length / 2)

    turtle.right(90)
    turtle.forward(length / 2)
    turtle.right(90)
    turtle.forward(length)
    turtle.left(90)
    turtle.forward(length / 2)
    turtle.right(90)

    drawHTree(turtle, order - 1, None, length / 2)

    turtle.right(90)
    turtle.forward(length)
    turtle.right(90)

    drawHTree(turtle, order - 1, None, length / 2)

    turtle.right(90)
    turtle.forward(length / 2)
    turtle.left(90)
    turtle.forward(length / 2)  # always leave the turtle where you found it!

yertle = Turtle()

drawHTree(yertle, 2, (0, 0), 200)

screen = Screen()

screen.exitonclick()

产品

【讨论】:

  • 非常感谢您的回复!我想知道我如何执行不同的订单我如何在不同级别执行此操作?
  • @zmoores1,除了说“根据需要将第三个参数更改为drawHTree(yertle, 200, 3)”之外,我不明白你的问题。
  • @zmoores1,我已经调整了代码,使深度 0 是一个简单的 H,深度 1 生成您链接的图像。
  • @zmoores1,我还使drawHTree(turtle, order, center, length) 函数与您的解释中描述的参数匹配,这与您的代码drawHTree(length, depth) 不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多