如何使用乌龟在 python 中绘制 sierpinski 地毯

How to draw a sierpinski carpet in python using turtle

我正在尝试使用 turtle 在 python 中创建 Sierpinski 地毯。到目前为止,这是我的代码:

from turtle import *

# Make a screen and a pen
pen = Pen()
screen = Screen()
pen.speed(0)
pen.color('orange')
pen.width(1.5)

def s (n, l):
    for i in range (4):
        s(n-1, l)
        pen.right(45); pen.forward(l); pen.right(45)
        s(n-1, l)
        pen.left(90); forward (l); pen.left(90)
        s(n-1, l)
        pen.right(45); pen.forward(l); pen.left(45)
        s(n-1, l)

但是,每当我 运行 它时,我都会收到此消息:

line 17, in s
    s(n-1, l)
  [Previous line repeated 990 more times]
RecursionError: maximum recursion depth exceeded

我尝试使用 if i in range(4): 但这也不起作用,我哪里错了?

您需要 "stop condition" 来停止递归。

例如:

 if n == 0: # "stop condition"

    # draw or exit

 else: # recursions

    # execute some recursions

我不懂算法,但我用这段代码创建了地毯。

我使用 trace(0)update() 只是为了画得更快。

#!/usr/bin/env python3

import turtle

# --- functions ---

def s(n, l):

    if n == 0: # stop conditions

        # draw filled rectangle

        turtle.color('black')
        turtle.begin_fill()
        for _ in range (4):
            turtle.forward(l)
            turtle.left(90)
        turtle.end_fill()

    else: # recursion

        # around center point create 8 smalles rectangles.
        # create two rectangles on every side 
        # so you have to repeat it four times

        for _ in range(4):
            # first rectangle
            s(n-1, l/3)    
            turtle.forward(l/3)

            # second rectangle
            s(n-1, l/3)    
            turtle.forward(l/3)

            # go to next corner
            turtle.forward(l/3)
            turtle.left(90)

        # update screen
        turtle.update()

# --- main ---    

# stop updating screen (to make it faster)
turtle.tracer(0) 

# start
s(4, 400)

# event loop
turtle.done()

维基百科:Sierpinski carpet