给定深度的变递归函数

2024-04-30 02:01:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个递归函数,使用pythonturtle模块绘制分形:

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初学者手册的任务,我完全被困在其中。我想这个问题的尴尬标题反映了我对这个问题缺乏理解。你知道吗


Tags: 模块inforsizeifdef绘制order
2条回答

我同意@quamrana对这件事的看法,但让我们解决一个可能是难题的问题。有点诡计。你知道吗

首先,合并函数必须采用四个参数,因为ordercircle()参数与orderfract()参数不相关。我们将其中的第一个重命名为sides(),因为这就是它所代表的。你知道吗

其次,您的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)调用之外,我们还可以执行类似fract(t, 3, 3, 300)的变体:

enter image description here

您可能要解决的下一个问题是如何使这些图像在屏幕上居中,这样fract(t, 5, 1, 300)就不会从边缘掉下来。你知道吗

假设你的fract()函数应该自己调用,那么我就可以成功地运行你的代码了。你知道吗

您所做的是定义一个递归函数fract(),它被circle()函数多次调用。这叫做组合函数。这是件好事。你知道吗

你的每一个功能都有明确的行为,也就是说它们是内聚的。这意味着其他程序员可以选择您的函数(尤其是fract()),并在自己的程序中重用它们。你知道吗

我的观点是最好有许多小的内聚函数(以及类和模块),它们可以以比最初预期的更多的方式组合在一起。你知道吗

相关问题 更多 >