使用turtle无法理解这个python程序中的递归

时间:2015-05-27 23:30:05

标签: python recursion turtle-graphics

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。?

2 个答案:

答案 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时,递归停止。否则你会有无休止的递归调用。