这是我第一次问问题,希望你们中的一些人有时间回答。
因此,我的目标是使用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
。
这是代码的略微修改版本,并print
引发了一些调用以帮助跟踪执行。
我还做了其他一些小的更改。我简化了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
为什么我在输出中得到一个额外的1*1,这有点倒退?有点像递归初学者,希望得到详细的答案。 输出
问题内容: 我得到以下代码: 我可以理解诸如阶乘和斐波那契这样的递归,但是对于这一点我不能理解。我试图追踪逻辑: 我总是以其他任何数字结尾7,我知道这是错误的,因为在运行程序时会得到不同的值。您能帮我了解递归在这里如何工作吗? 问题答案: 我认为这是不言自明的,如果您需要更多信息,请评论!
问题内容: 我正在尝试制作一个Python游戏,其中红龟追逐蓝龟。当红色乌龟抓到蓝色乌龟时,我希望它在屏幕上说“碰撞”,但它不起作用。当它碰撞时,什么也没有发生,并且给我一个错误“ Turtle”对象不可调用”。 问题答案: 与实际编程相比,这段代码似乎更让人想不到: 乌龟没有方法。您不能使用此语句简单地将方法添加到现有类。没有和功能。每次运动后,如果需要,该碰撞测试将只执行一次。让我们尝试挽救我
我是Python初学者。我对Python中的正则表达式有所了解。例如:\d指的是匹配0个或更多的数字。 上面的表达式-第3行-在做什么?更具体地说,写有什么意义?
问题内容: 是否可以在Python中定义递归列表理解? 可能是一个简单的示例,但类似于: 这样有可能吗? 问题答案: 不,没有(记录,可靠,稳定,… ;-)引用“当前理解”的方法。您可以只使用一个循环: 当然,这是非常昂贵的(O(N平方)),因此您可以使用辅助工具对其进行优化(我假设将项目的顺序与中的项目顺序保持一致,否则可以做到;-)。 ..: 对于非常长的列表(O(N)而不是N平方),这要快得
本文向大家介绍Python尾递归优化实现代码及原理详解,包括了Python尾递归优化实现代码及原理详解的使用技巧和注意事项,需要的朋友参考一下 在传统的递归中,典型的模式是,你执行第一个递归调用,然后接着调用下一个递归来计算结果。这种方式中途你是得不到计算结果,知道所有的递归调用都返回。 这样虽然很大程度上简洁了代码编写,但是让人很难它跟高效联系起来。因为随着递归的深入,之前的一些变量需要分配堆栈