使用递归生成分形正方形

Generate fractal squares using recursion

我正在学习递归,并希望在 Python(乌龟)中实现这一目标:

我做了一个递归函数,从左下角开始画一个正方形,面向'east'。我可以让其中一侧的方块正确,但另一侧不正确。

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

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)

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

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

  1. 函数必须从哪里开始(在您的情况下,您指定 "bottom-left corner")。
  2. 它停止的地方 (?) - 位置和方向!这一点在您的代码中不清楚,这就是它不起作用的原因。

你的代码有两个问题:

  • 您应该移动 backward(length // 2) 以正确开始绘制左侧方块(正如您在评论中所做的那样)
  • 你应该回到开始广场的地方(大广场的bottom-left角)

这是带有一些注释的代码:

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),它将 turtle 移动到其原始位置。