Python 给定深度下的变递归函数

Python 给定深度下的变递归函数,python,recursion,turtle-graphics,fractals,Python,Recursion,Turtle Graphics,Fractals,我有一个递归函数,使用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) 我有另一个函数调用第一个函数并修改最后一个角度,这样分形就

我有一个递归函数,使用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初学者书中的一个任务,我完全被它所困扰。我想这个问题的尴尬标题反映了我对这个问题缺乏理解

假设您的
fract()
函数应该自己调用,那么我就能够成功运行您的代码了

您所做的是定义一个递归函数
fract()
,它被
circle()
函数多次调用。这称为编写函数。这是一件好事

您的每个功能都有严格定义的行为,即它们是内聚的。这意味着其他程序员可以选择您的函数(特别是
fract()
),并在自己的程序中重用它们


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

我同意@quamrana在这个问题上的观点,但让我们来解决一个困难的问题。有点诡计

首先,合并函数必须采用四个参数,因为
order
参数到
circle()
order
参数到
fract()
不相关。我们将把其中的第一个重命名为
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)
的变体:


您可能要解决的下一个问题是如何将这些图像居中显示在屏幕上,以便
fract(t,5,1300)
不会从边缘脱落。

首先,您可以更新问题以整理缩进。其次,你能解释什么是雪花(…)。它看起来像一个函数调用,但没有定义。Upps,谢谢,doneOk,这目前不是递归的。您的意思是让
fract()
函数调用自己吗?它当前正在调用
koch_loop()
,其参数看起来似乎可以调用自己。。。给自己的提示:在还没有完全清醒的时候不要发布问题Hanks@quamrana!虽然很高兴听到我的解决方案似乎足够了,但我想知道是否有可能在单个递归函数中解决这个任务。我尝试引入一个深度计数器,并根据深度改变最后一个角度,I。E当
depth%2==0
更改为
t.right(120)
,但没有效果。虽然这是可能的,但您将把
circle()
函数的一部分嵌入
fract()
函数中,这将使它变成另一个函数,而我的其他程序员将不再能够重用它。