【问题标题】:Cannot understand recursion in this python program using turtle无法理解这个使用turtle的python程序中的递归
【发布时间】:2015-05-27 23:30:05
【问题描述】:
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 时,它现在不应该是负数吗? 所以现在函数不应该像它的那样工作如果条件是那个 branchLen > 5.?

【问题讨论】:

  • 每个递归算法都有一个基本情况。

标签: python recursion turtle-graphics


【解决方案1】:

您似乎认为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) 什么都不做。

【讨论】:

    【解决方案2】:

    但这一次当它减少 15 的 branchLen 时,它现在不应该是负数吗?所以现在函数不应该像它的 if 条件那样工作,即 branchLen > 5.?

    这正是发生的事情。当branchLen 小于 5 时,递归停止。否则你会有无穷无尽的递归调用。

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 2021-04-08
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多