使用递归生成分形正方形
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
绘制分形时,需要注意以下几点:
- 函数必须从哪里开始(在您的情况下,您指定 "bottom-left corner")。
- 它停止的地方 (?) - 位置和方向!这一点在您的代码中不清楚,这就是它不起作用的原因。
你的代码有两个问题:
- 您应该移动
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 移动到其原始位置。
我正在学习递归,并希望在 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
绘制分形时,需要注意以下几点:
- 函数必须从哪里开始(在您的情况下,您指定 "bottom-left corner")。
- 它停止的地方 (?) - 位置和方向!这一点在您的代码中不清楚,这就是它不起作用的原因。
你的代码有两个问题:
- 您应该移动
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 移动到其原始位置。