Python乌龟:递归函数
Python Turtle: Recursive function
我无法弄清楚如何创建一个根据用户输入提取大写字母 I 的函数。如果用户输入是 1,它会绘制一个 I,如果它是 2,它会绘制 2 个 I's,如下图所示。
我可以通过使用简单的乌龟方法手动完成前 2 个级别,但是您如何递归地执行此操作以便在更高级别执行此操作?
def my_turtle_function(n):
my_win = turtle.Screen()
my_turtle = turtle.Turtle()
my_turtle.speed(2)
my_turtle.left(90)
if n == 1:
my_turtle.forward(100)
my_turtle.right(90)
my_turtle.forward(100)
my_turtle.forward(-200)
my_turtle.forward(100)
my_turtle.right(90)
my_turtle.forward(200)
my_turtle.right(90)
my_turtle.forward(100)
my_turtle.forward(-200)
my_turtle.forward(100)
my_turtle.right(90)
my_turtle.forward(100)
如果你想递归地做,你必须再次调用函数,使用不同的参数,例如"level" 小了一个,笔画只有原来的一半长。确保乌龟在方法的开始和结束时在同一个地方并面向相同的方向,然后当你在角落时再次调用该函数。
这是一些伪代码
def my_turtle_function(t, length, n):
if n > 0:
move up and left by length, face north
call my_turtle_function(t, length/2, n-1)
move right, right by length, face north
call my_turtle_function(t, length/2, n-1)
move left, down, down, left by length, face north
call my_turtle_function(t, length/2, n-1)
move right, right by length, face north
call my_turtle_function(t, length/2, n-1)
move back to starting point
您还可以通过对 'I' 的两半和条形的两侧使用循环来缩短代码。
import turtle
def move_me(trt, step, n):
while n > 0:
tmp = trt.heading()
trt.lt(90)
trt.fd(step)
trt.rt(90)
trt.fd(step)
move_me(trt, step / 2, n - 1)
trt.fd(-2 * step)
move_me(trt, step / 2, n - 1)
trt.fd(step)
trt.rt(90)
trt.fd(2 * step)
trt.rt(90)
trt.fd(step)
move_me(trt, step / 2, n - 1)
trt.fd(-2 * step)
move_me(trt, step / 2, n - 1)
trt.fd(step)
trt.rt(90)
trt.fd(step)
n -= 1
trt.seth(tmp)
my_win = turtle.Screen()
my_turtle = turtle.Turtle()
my_turtle.speed(10)
move_me(my_turtle, 200, 3)
我无法弄清楚如何创建一个根据用户输入提取大写字母 I 的函数。如果用户输入是 1,它会绘制一个 I,如果它是 2,它会绘制 2 个 I's,如下图所示。
我可以通过使用简单的乌龟方法手动完成前 2 个级别,但是您如何递归地执行此操作以便在更高级别执行此操作?
def my_turtle_function(n):
my_win = turtle.Screen()
my_turtle = turtle.Turtle()
my_turtle.speed(2)
my_turtle.left(90)
if n == 1:
my_turtle.forward(100)
my_turtle.right(90)
my_turtle.forward(100)
my_turtle.forward(-200)
my_turtle.forward(100)
my_turtle.right(90)
my_turtle.forward(200)
my_turtle.right(90)
my_turtle.forward(100)
my_turtle.forward(-200)
my_turtle.forward(100)
my_turtle.right(90)
my_turtle.forward(100)
如果你想递归地做,你必须再次调用函数,使用不同的参数,例如"level" 小了一个,笔画只有原来的一半长。确保乌龟在方法的开始和结束时在同一个地方并面向相同的方向,然后当你在角落时再次调用该函数。
这是一些伪代码
def my_turtle_function(t, length, n):
if n > 0:
move up and left by length, face north
call my_turtle_function(t, length/2, n-1)
move right, right by length, face north
call my_turtle_function(t, length/2, n-1)
move left, down, down, left by length, face north
call my_turtle_function(t, length/2, n-1)
move right, right by length, face north
call my_turtle_function(t, length/2, n-1)
move back to starting point
您还可以通过对 'I' 的两半和条形的两侧使用循环来缩短代码。
import turtle
def move_me(trt, step, n):
while n > 0:
tmp = trt.heading()
trt.lt(90)
trt.fd(step)
trt.rt(90)
trt.fd(step)
move_me(trt, step / 2, n - 1)
trt.fd(-2 * step)
move_me(trt, step / 2, n - 1)
trt.fd(step)
trt.rt(90)
trt.fd(2 * step)
trt.rt(90)
trt.fd(step)
move_me(trt, step / 2, n - 1)
trt.fd(-2 * step)
move_me(trt, step / 2, n - 1)
trt.fd(step)
trt.rt(90)
trt.fd(step)
n -= 1
trt.seth(tmp)
my_win = turtle.Screen()
my_turtle = turtle.Turtle()
my_turtle.speed(10)
move_me(my_turtle, 200, 3)