这是我第一次问问题,希望你们中的一些人有时间回答。
因此,我的目标是使用turtle模块编写一个python脚本来编写毕达哥拉斯树。
我已经花了几天时间,但确实无法超越某个特定点,因此我在网上寻找帮助。我找到了可以满足我的要求的代码,但是只包含很少的代码行:
import turtle t = turtle.Pen() LIMIT =11 SCALAR = 0.5 * (2 ** 0.5) def drawTree(size, depth): drawSquare(size) if depth + 1 <= LIMIT: t.left(90) t.forward(size) t.right(45) drawTree(size * SCALAR, depth + 1) t.forward(size * SCALAR) t.right(90) drawTree(size * SCALAR, depth + 1) t.left(90) t.backward(size * SCALAR) t.left(45) t.backward(size) t.right(90) def drawSquare(sideLength): for i in range(4): t.forward(sideLength) t.left(90) t.up(); t.goto(-100, -200); t.down() drawTree(170.0, 0)
因此,我理解大多数代码,但“ if”的第二和第三段除外:为什么要执行它们?如果函数不断重复自身,它将永远无法正常到达该点!我确定我在这里确实缺少一些简单的东西,希望大家都理解我的问题:)再次感谢!
该drawTree功能不保留自称永远递归调用所以最终的陈述后 做 得到执行。当depth==处的递归调用LIMIT返回时,控制权将返回到上一个调用depth= = LIMIT-1。
drawTree
depth
LIMIT
LIMIT-1
这是代码的略微修改版本,并print引发了一些调用以帮助跟踪执行。
print
我还做了其他一些小的更改。我简化了SCALAR计算:0.5 * sqrt(2)== sqrt(0.5),仅在乌龟实际绘制正方形时才放下笔。我还添加了一个turtle.mainloop()呼叫,以便在绘图完成后窗口保持打开状态。
SCALAR
0.5 * sqrt(2)
sqrt(0.5)
turtle.mainloop()
from __future__ import print_function import turtle LIMIT = 3 SCALAR = 0.5 ** 0.5 INDENT = ' ' * 4 def drawTree(size, depth, branch): print(INDENT * depth, branch, depth, 'start') drawSquare(size) if depth + 1 <= LIMIT: t.left(90) t.forward(size) t.right(45) drawTree(size * SCALAR, depth + 1, 'left ') t.forward(size * SCALAR) t.right(90) drawTree(size * SCALAR, depth + 1, 'right') t.left(90) t.backward(size * SCALAR) t.left(45) t.backward(size) t.right(90) print(INDENT * depth, branch, depth, 'stop') def drawSquare(sideLength): t.down() for i in range(4): t.forward(sideLength) t.left(90) t.up() t = turtle.Pen() t.up() t.goto(-100, -200) drawTree(100.0, 0, 'root') turtle.mainloop()
输出
root 0 start left 1 start left 2 start left 3 start left 3 stop right 3 start right 3 stop left 2 stop right 2 start left 3 start left 3 stop right 3 start right 3 stop right 2 stop left 1 stop right 1 start left 2 start left 3 start left 3 stop right 3 start right 3 stop left 2 stop right 2 start left 3 start left 3 stop right 3 start right 3 stop right 2 stop right 1 stop root 0 stop