【问题标题】:Turtle Graphics with Recursion带有递归的海龟图形
【发布时间】:2017-10-04 13:08:24
【问题描述】:

我需要使用递归和海龟图形绘制一个形状。

我更像是一个循环者,很少使用递归,所以这里有一些帮助会很好。甚至不知道从哪里开始。

形状只需要看起来很酷。

【问题讨论】:

  • 欢迎来到 SE,到目前为止您尝试过什么?
  • 我不知道从哪里开始,所以如果有人可以帮助我,其他的我可以尝试,那么开始会很棒。
  • 看看kidscoderepo.com/python.html,这是一个很好的起点,满足你的酷炫要求

标签: python recursion turtle-graphics fractals


【解决方案1】:

天哪!多么有趣的问题:)

由于您自称是“循环者”,所以我会像循环一样考虑递归。

for 循环中,执行循环体直到满足for 循环条件。现在,递归非常相似。您一直调用该函数,直到函数的参数不再遇到递归情况。他们遇到了一个基本情况,然后返回一个递归可以建立的值。

所以这么想递归,我们来想想怎么画一个正方形。您需要首先确定代码的哪些部分被重复(即尝试执行相同操作的 for 循环的主体中的内容)。然后,确定您希望何时停止此重复(即我如何知道 for 循环何时退出)。

在绘制正方形时,我可以想到至少重复 4 次的两个主要事物。乌龟前进一定的步数,乌龟转 90 度(或 270 度,取决于方向)。所以这将是我们在递归案例中详述的内容。

现在,让我们考虑一下基本情况。好吧,我们知道正方形有 4 条边,所以在乌龟画完 4 条边后,我们希望它停止。

最后,让我们考虑一下函数声明以及递归情况和基本情况这两个部分如何发挥作用。函数声明可以采用以下形式(在 Python 中):

def draw_square_recursive(turn_deg=90, side_len, sides=4):
    """ 
    Function draws a square with turtle graphics recursively 

    :param turn_deg: an int, the number of degrees a turtle should turn
    :param side_len: an int, the length of a side of the square
    :param sides: an int, the number of sides in our square
    """

turn_degside_len 对于我们的递归案例很重要,因为它们定义了乌龟应该如何转动以及它应该“走”多远。 sides 是一个有趣的参数,我们可以使用它来决定是继续重复还是停止。如果我们每次画边时都从sides 中减去1,我们就会知道我们需要在sides == 0 时停止重复,这是一个基本情况! 因此,每当我们再次调用我们的函数时,我们都会将其称为draw_square_recursive(side_len, sides-1):

总的来说,函数的结构如下:

def draw_square_recursive(turn_deg=90, side_len, sides=4):
    """ 
    Function draws a square with turtle graphics recursively 

    :param turn_deg: an int, the number of degrees a turtle should turn
    :param side_len: an int, the length of a side of the square
    :param sides: an int, the number of sides in our square
    """
    if sides == 0:
        # base case!
    else:
        # recursive case!

请注意,这个函数名为draw_square_recursive,但它可以更泛化到其他形状。你知道怎么做吗?

对不起,如果这是一个冗长的答案!希望对你有帮助;p

【讨论】:

    【解决方案2】:

    没有任何参数化,这里是一个开始:

    import time
    from turtle import *
    
    def recurse(n):
        if n>0:
            left(10)
            forward(5)
            recurse(n-1)
    
    recurse(20)
    time.sleep(5)
    

    当您创建递归函数时,您需要有一个停止标准,以有效地保证您的程序将在某个时刻退出。

    【讨论】:

    • 感谢大家的回答。我想我现在走在正确的轨道上。
    【解决方案3】:

    编辑多于回答,但递归如下:

    def recurse(n):
        if n>0:
            left(10)
            forward(5)
            recurse(n-1)
    

    最好写成迭代:

    for n in range(2):
        left(10)
        forward(5)
    

    类似于那些问“如何使用递归计算列表中元素的数量?”的人。同样使用递归绘制正方形。

    我知道我们的目标是学习递归,但似乎迷失了的是,有时递归会使美妙的事情发生,有时它只会减慢您的程序。分形是一个用递归创造奇迹的机会:

    import sys
    from turtle import Turtle, Screen
    
    def hilbert_curve(n, turtle, angle=90):
        if n <= 0:
            return
    
        turtle.left(angle)
        hilbert_curve(n - 1, turtle, -angle)
        turtle.forward(1)
        turtle.right(angle)
        hilbert_curve(n - 1, turtle, angle)
        turtle.forward(1)
        hilbert_curve(n - 1, turtle, angle)
        turtle.right(angle)
        turtle.forward(1)
        hilbert_curve(n - 1, turtle, -angle)
        turtle.left(angle)
    
    depth = int(sys.argv[1])
    size = 2 ** depth
    
    screen = Screen()
    screen.setworldcoordinates(0, 0, size, size)
    
    yertle = Turtle('turtle')
    yertle.speed('fastest')
    yertle.penup()
    yertle.goto(0.5, 0.5)
    yertle.pendown()
    
    hilbert_curve(depth, yertle)
    
    yertle.hideturtle()
    
    screen.exitonclick()
    

    用法

    % python3 hilbert.py 5
    

    (部分)输出

    我不是在挑选其他答案,我建议你想大一点(或者至少超越“只需要看起来很酷”。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2018-05-30
      • 1970-01-01
      • 2014-11-04
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多