在给定深度

时间:2018-05-12 09:25:43

标签: python recursion turtle-graphics fractals

我有一个使用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初学者的书中的一项任务,我完全坚持这一点。我想这个问题的尴尬标题反映了我对这个问题缺乏了解。

2 个答案:

答案 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() 之类的变体:

enter image description here

您可能想要解决的下一个问题是如何将这些图像置于屏幕中心,以便fract(t, 4, 2, 300)不会脱离边缘。