您已经明确地指出了目标,但让我们考虑一个更简单的例子,如果调用函数 kochCurve(10, 3)
:
- 第一次调用时,
degree
不为 0
,并且 length
是 10
,满足 >= 3
条件,因此按预期操作,将长度除以 3
后递归调用 kochCurve(3.33..., 2)
。
- 第二次调用时,
degree
等于 2
并且仍然不为 0
,而 length
依然大于 3
,所以再次调用函数 kochCurve(1.11..., 1)
。
然而,在后续调用中,尽管 degree
未变为 0
,但 length
已经不再大于或等于 3
,此时函数不做任何操作就直接返回,然后执行下一条指令即旋转光标。
这一过程会持续下去。函数要么因两个条件均不成立而什么也不做,要么就是旋转光标——这正是您所描述的现象。
主要问题在于您的递归函数缺少一个恰当的基本情况。
此外,还有一个问题:由于每次递归调用时都将 length
除以 3
,导致 length
的值很快就会小于 1
。虽然Python中的turtle允许小于一个像素的移动(这可能不是所有turtle实现都支持的),但初始阶段的实际进展将非常微小,看起来就像是光标的快速旋转。
您可以先尝试使用更合理的参数运行代码,例如 kochCurve(1000, 4)
。
修复代码有多种方式。最简单的方法可能是移除 if length >= 3
这个条件,但您可能原本是想限制当长度变得任意小时的递归深度。
如果您确实希望保留显式的 degree
参数,同时也根据长度进行限制,可以修改代码如下:
def kochCurve(length, degree):
if degree == 0 or length < 3:
t.forward(length)
else:
length = length / 3
degree = degree - 1
kochCurve(length, degree)
t.right(60)
kochCurve(length, degree)
t.right(240)
kochCurve(length, degree)
t.right(60)
kochCurve(length, degree)
最后关于风格的一点建议:在Python中,kochCurve
并非首选命名方式,建议改为 koch_curve
。我们都有各自的偏好,但在编程时遵循语言设计者所推荐的习惯会更为合理。