我试图提高对递归的理解,视觉表现对我很有帮助。我有一个递归的树绘图功能,我希望能够逐步完成并考虑每个阶段发生的事情。我找到了IDLE的调试器,但是一旦调用了递归函数,我似乎无法停止它。此外,当我单步执行代码时,从龟模块中打开了几个窗口,这一切都变得一团糟。
这是否可以使用IDLE,或者我是否应该手动编码暂停和日志信息我需要了解此功能?作为次要问题,任何人都可以解释这段代码的工作原理吗?它似乎首先绘制了所有右手分支,我可以遵循它,但它的作用开始看起来像伏都教。
以下代码:
import turtle
def tree(branchLen,t):
if branchLen > 5:
t.forward(branchLen)
t.right(20)
tree(branchLen-15,t)
t.left(40)
tree(branchLen-15,t)
t.right(20)
t.backward(branchLen)
def main():
t = turtle.Turtle()
t.speed(1)
myWin = turtle.Screen()
t.left(90)
t.up()
t.backward(100)
t.down()
t.color("green")
tree(75,t)
myWin.exitonclick()
main()
答案 0 :(得分:0)
我可以想到两种方法来帮助您可视化这些步骤。
第一个是在t.stamp()
函数的开头添加tree
。每次调用tree
函数时,这将提供另一个视觉指示。
def tree(branchLen, t):
if branchLen > 5:
t.stamp()
t.forward(branchLen)
...
您已经将乌龟的速度减慢了。降低操作速度的另一种方法是导入time
模块并使用sleep
函数。如果使用此解决方案,建议您在递归调用sleep
之前使用tree
调用。
import turtle
import time
def tree(branchLen,t):
if branchLen > 5:
t.forward(branchLen)
t.right(20)
time.sleep(0.5)
tree(branchLen-15,t)
t.left(40)
tree(branchLen-15,t)
time.sleep(0.5)
t.right(20)
t.backward(branchLen)
您甚至可以结合使用这两种方法来区分左右分支(第一个和第二个递归调用)的树调用时间。
答案 1 :(得分:0)
这是一种可视化正在发生的情况而无需修改原始递归子例程的方法。首先,我们通过反转符号将backward()
更改为forward()
。然后,我们粉碎了foward()
的新实现,该实现更改笔的颜色,画线,在控制台上等待回车,撤消它刚刚所做的操作并最终完成原始forward()
会做的事情:
from turtle import Screen, Turtle
def visible_forward(self, distance):
if self.isdown():
color = self.pencolor()
self.pencolor('red')
forward_original(self, distance)
input("step> ")
self.pencolor(color)
forward_original(self, -distance)
forward_original(self, distance)
def tree(branchLen, t):
if branchLen > 5:
t.forward(branchLen)
t.right(20)
tree(branchLen-15, t)
t.left(40)
tree(branchLen-15, t)
t.right(20)
t.forward(-branchLen)
myWin = Screen()
turtle = Turtle()
forward_original, Turtle.forward = Turtle.forward, visible_forward
turtle.speed('slowest')
turtle.left(90)
turtle.penup()
turtle.backward(100)
turtle.pendown()
turtle.color("green")
tree(75, turtle)
myWin.mainloop()
我只建议将此作为学习或调试的技巧,而不建议将其用于完成的代码。