我可以理解简单的递归,例如:
def count(n):
if n <= 0:
return
else:
print n
count(n-1)
count(3)
然而,当面对更复杂的代码时,例如,Koch雪花的实现:
def koch(order, size):
if order == 0:
t.forward(size)
else:
koch(order-1, size/3)
t.left(60)
koch(order-1, size/3)
t.right(120)
koch(order-1, size/3)
t.left(60)
koch(order-1, size/3)
koch(1, 100)
我感到困惑。我不明白如何遵循这些多个递归函数调用。
答案 0 :(得分:2)
我认为任何人都不容易在头脑中详细可视化执行路径。使用表示各个递归调用的节点绘制树是在纸上可视化的好方法。如果每个节点都是一个气泡,您可以在其中放置有关变量状态等的信息。在存在多个递归调用的情况下,每个节点下面都会有多个树,表示时间轴。
答案 1 :(得分:2)
您的Koch雪花示例很好。雪花是由什么组成的?在第一次迭代(order == 0
)中,它从一个简单的行开始。这是基本情况。
________
现在,对于下一级递归(order == 1
),该基本情况被分成四个子行,形成一个倒置的V
。要实现此V
,您需要以适当的角度构建四条线(您需要t.left(60)
和类似的命令)。
这些行中的每一行(自己都认为)是基本情况的一个实例。它只有三倍。这就是你在koch(order-1, size/3)
中看到的内容。
/\
__/ \__
现在想象下一级递归 - 每一行再次分成四个子行。模式继续......
答案 2 :(得分:2)
对于koch(1,100),它看起来像这样:
koch(1, 100)
->
koch(0, 33)
order == 1, so stop recursing down this branch
<-
t goes left
koch(0, 33)
order == 1, so stop recursing down this branch
<-
t goes right
koch(0, 33)
order == 1, so stop recursing down this branch
<-
t goes left
koch(0, 33)
order == 1, so stop recursing down this branch
<-
<-
done
对于koch(2,100),对koch的第一次调用将扩展到上面,
koch(2, 100)
->
koch(1, 100)
->
koch(0, 33)
order == 1, so stop recursing down this branch
<-
t goes left
...
...
t goes left
...
尝试按照建议在纸上进行追踪。你最终会得到像树一样的结构。
答案 3 :(得分:1)
尝试一下以下内容:
def koch(order, size):
print 'koch(', order, size, ')'
if order == 0:
t.forward(size)
print 'Got to the bottom of it'
else:
koch(order-1, size/3)
t.left(60)
koch(order-1, size/3)
t.right(120)
koch(order-1, size/3)
t.left(60)
koch(order-1, size/3)
koch(1, 10)
你应该看看每个电话如何调用koch,直到它最终到达链的底部。
答案 4 :(得分:1)
python导师网站可以帮助可视化程序流程 http://www.pythontutor.com/
答案 5 :(得分:0)
要了解代码,有助于了解创建koch雪花的第一步。在每个递归步骤中,您都有一个三角形,代码覆盖另一个。现在你有了调用代码的新三角形 - 一切从头开始。