我正在尝试使用Python绘制一棵分形树。特别是,我试图理解下面的代码,发现这里
def tree(branchLen,t):
if branchLen > 5:
t.forward(branchLen)
t.right(20)
tree(branchLen-15,t)
t.left(40)
tree(branchLen-10,t)
t.right(20)
t.backward(branchLen)
具体来说,我的问题是我不了解最后一步(即t.backward(branchlen)
)完成之后会发生什么。branchlen
在此步骤之后,变量的值如何变化?我尝试遵循算法并使用铅笔和纸手动构造树,但无济于事。任何人的帮助将不胜感激。提前致谢!
我不了解完成最后一步(即
t.backward(branchlen)
)后会发生什么。
什么都没发生; 您只需返回到呼叫者,然后在tree
呼叫后的那一行继续。
当然,因为这是一个递归函数,所以您的调用方通常将是的另一个实例tree
(除非您一直处于栈顶)。
在此步骤之后,变量branchlen的值如何变化?
没有。但是,每个实例tree
都有自己的本地人。
因此,例如,让我们从顶部开始。
首先,我们打电话说tree(25, t)
。在里面branchLen
是25
。
现在,它t.forward(25)
和t.right(20)
。然后就可以了tree(25-15, t)
。这是的新电话tree
,在此新电话内branchLen
是10
。
因此,该新呼叫执行t.forward(10)
和t.right(20)
。然后就可以了tree(10-15, t)
。这是的新电话tree
,在此新电话内branchLen
是-5
。因此,由于if
失败,该新呼叫将立即返回,然后我们返回到branchLen
is的呼叫10
。可以t.left(40)
,然后调用tree(10-10, t)
。同样,新的呼叫wherebranchLen
是0
立即返回,因此我们回到呼叫branchLen
is 10
。我们先做t.right(20)
,然后t.backward(10)
再返回。
现在,我们又回到了外呼,这里branchLen
是25.继续上t.left(40)
,然后调用tree(25-10, t)
。这是又一个新的呼叫tree
,但时间branchLen
是15
不是10
。一切与上一段几乎相同,因此我不再重复,它以该调用返回为结尾。
现在我们回到外部调用,branchLen
又是25。t.right(20)
然后继续,然后t.backward(25)
完成,然后返回。
既然这是由我们的顶级代码调用的,那么我们就完成了。
如果递归仍然在抛出您,让我们制作一个非递归版本,该版本仅执行2步而不是N步:
def tree(branchLen,t):
if branchLen > 5:
t.forward(branchLen)
t.right(20)
little_tree(branchLen-15,t)
t.left(40)
little_tree(branchLen-10,t)
t.right(20)
t.backward(branchLen)
def little_tree(littleBranchLen,lt):
if littleBranchLen > 5:
lt.forward(littleBranchLen)
lt.right(20)
lt.left(40)
lt.right(20)
lt.backward(littleBranchLen)
现在很明显,当第一次tree
调用little_tree
时,当它返回时,它将返回到中的t.left(40)
行tree
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句