代码之家  ›  专栏  ›  技术社区  ›  Tom Smith

使用递归生成分形方块

  •  2
  • Tom Smith  · 技术社区  · 9 年前

    我正在学习递归,想用Python(乌龟)实现这一点:

    Fractal cubes

    我做了一个递归函数,从左下角开始画一个正方形,面向“东”。我可以把一边的正方形画对,但不能把另一边的正方画对。

    在绘制较小的正方形之前向后移动会产生奇怪的结果:

    Odd results

    from turtle import *
    delay(0)
    speed(10)
    
    def square(length, level):
    if level == 0:
        return
    else:
        # Start from the bottom-left corner
        forward(length)
        # Right square
        square(length // 2, level - 1)
        lt(90)
    
        forward(length)
        lt(90)
    
        forward(length)
        lt(90)
    
        forward(length)
        lt(90)
    
        ### Try moving backward before drawing
        ##backward(length / 2)
    
        # Left square
        square(length // 2, level - 1)
    
    square(110, 4)
    

    学习这些分形有什么技巧或好例子吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Holt    9 年前

    使用绘制分形时 turtle ,您应注意以下几点:

    1. 函数必须开始的位置(在您的情况下,指定“左下角”)。
    2. 在哪里停止(?)-位置和方向!这一点在您的代码中并不清楚,这就是为什么它不工作的原因。

    代码中有两个问题:

    • 你应该走了 backward(length // 2) 正确地开始绘制左正方形(正如您在注释中所做的那样)
    • 你应该回到你开始广场的地方(大广场的左下角)

    下面是带有一些注释的代码:

    def square(length, level):
        # Start from the bottom-left corner    
        if level == 0:
            return
        else:
            # Draw the bottom side
            forward(length)
            # Draw the right square
            square(length // 2, level - 1)
            # Assume we ended at the same position
            # Draw the right side
            lt(90); forward(length)
            # Draw the upper side
            lt(90); forward(length)
            # Draw the left side
            lt(90); forward(length)
            # Go backward
            lt(90); backward(length // 2) ;
            # Draw the left square
            square(length // 2, level - 1)
            # Go back to the original position
            forward(length // 2)
    

    基本上,你错过了最后一次 forward(length // 2) 这将移动 乌龟 返回其原始位置。