import turtle
def tree(branchLen,t):
if branchLen > 5:
t.forward(branchLen)
t.right(40)
tree(branchLen-15,t)
t.left(80) #I don't get what happens after this.
tree(branchLen-15,t)
t.right(40)
t.backward(branchLen)
def main():
t = turtle.Turtle()
myWin = turtle.Screen()
t.left(90)
t.up()
t.backward(100)
t.down()
t.color("green")
tree(75,t)
myWin.exitonclick()
main()
我无法理解这个python程序中的递归。我得到它需要branchLen,如果它大于5,它向前绘制(branchLen)然后向右改变角度40度。然后再次调用函数,将branchLen减少15并再次调整,直到branchLen小于5.
然后它将乌龟向左转40度并再次调用该函数但是这次它将branchLen减少15并不应该现在为负?所以现在函数不应该是' t作为其if条件是branchLen> 5。?
答案 0 :(得分:2)
你似乎认为branchLen
在真的没有减少时会减少。呼叫tree(branchLen-15,t)
仅减少递归呼叫的branchLen
,而不是当前呼叫。它不像branchLen -= 15
。所以:
main
来电tree(75,t)
。tree(75,t)
再次调用tree(60,t)
然后调用tree(60,t)
(旋转后)。不是tree(45,t)
。tree(60,t)
调用tree(45,t)
两次(因此tree(45,t)
会被调用四次。)tree(15,t)
调用tree(0,t)
两次。tree(0,t)
都不做任何事。答案 1 :(得分:0)
但是这次将branchLen减少15点现在不应该是负面的吗?所以现在函数不应该工作,因为它的if条件是branchLen> 5。?
这正是发生的事情。当branchLen
小于5时,递归停止。否则你会有无休止的递归调用。