我有一个使用python turtle
模块绘制分形的递归函数:
def fract(t, order, size):
if order == 0:
t.forward(size)
else:
for angle in (60, -120, 60, 0):
fract(t, order - 1, size / 3)
t.left(angle)
我有另一个函数调用第一个函数并修改最后一个角度,以便分形构建一个圆
def circle(t, order, size):
for i in range(order):
fract(t, 2, size)
t.right(360 / order)
circle(t, 4, 300)
虽然这是按预期工作的,但真正的目标是在单个递归函数中获得相同的结果。
显然这不是一个真正的编程案例,而是来自python初学者的书中的一项任务,我完全坚持这一点。我想这个问题的尴尬标题反映了我对这个问题缺乏了解。
答案 0 :(得分:1)
假设您的fract()
函数应该自行调用,那么我就能够成功运行您的代码。
您所做的是定义一个递归函数fract()
,它由circle()
函数多次调用。这称为组成你的功能。这是一件好事。
您的每个职能都有严格定义的行为,即它们具有凝聚力。这意味着其他程序员可以获取您的函数(尤其是fract()
)并在自己的程序中重用它们。
我的观点是,最好有许多小的内聚功能(以及类和模块),它们可以以比原先预期更多的方式组合。
答案 1 :(得分:1)
我同意@quamrana对此事的看法,但让我们解决可能是一个难题。带着一点诡计。
首先,您的合并函数必须采用四个参数,因为order
的{{1}}参数与circle()
的{{1}}参数无关。我们会将其中的第一个重命名为order
,因为它代表的是它。
其次,您的fract()
函数不是完全递归,它在内部使用迭代。我将在我的解决方案中遵循相同的模式。
最后,我们需要一些隐藏的信息来使用 - 您可以使用默认的第五个参数在内部进行更改但是我将使用sides()
类型来实现此结果:< / p>
fract()
我相信这可以实现您想要的结果,只需对原始代码进行最少的更改。除了生成原始数字的sides
调用之外,我们还可以执行import turtle as t
def fract(t, sides, order, size):
if order == 0:
t.forward(size)
elif sides is not None:
for _ in range(sides):
fract(t, None, order, size)
t.right(360 / sides)
else:
for angle in (60, -120, 60, 0):
fract(t, None, order - 1, size / 3)
t.left(angle)
t.speed('fastest') # because I have no patience
fract(t, 4, 2, 300)
t.hideturtle()
t.exitonclick()
之类的变体:
您可能想要解决的下一个问题是如何将这些图像置于屏幕中心,以便fract(t, 4, 2, 300)
不会脱离边缘。