逐步完成Python Turtle Recursive Function

时间:2016-09-25 13:34:26

标签: python debugging recursion turtle-graphics

我试图提高对递归的理解,视觉表现对我很有帮助。我有一个递归的树绘图功能,我希望能够逐步完成并考虑每个阶段发生的事情。我找到了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()

2 个答案:

答案 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()

enter image description here

我只建议将此作为学习或调试的技巧,而不建议将其用于完成的代码。