|
|

楼主 |
发表于 2019-5-4 12:06:33
|
显示全部楼层
本帖最后由 stormc 于 2019-5-4 14:46 编辑
首先感谢大佬的耐心分析和回答。
不过还是有点似懂非懂。尝试把每一步操作后面进行打印注释,(递归调用前后均写打印注释),为减小步骤,改为tree(40),好像有点领悟到大佬的这个一层一层回去的具体意思
n的值有个回滚的过程。 #右边树 的代码运行完后, # 左边树 这段的第一次递归实际跳出来了,未运行(n不大于5),然后继续运行# 返回 段,也就是返回语句。
但是,按照正常写程序的思路,单个步骤其实就是,右树画完,返回,左树,返回。为何具体到写代码的时候就是 右树,左树,返回 ,那个“右树”和“左树”之间的“返回”代码能考虑到其实是不用写的?
修改后代码和打印消息如下:
- import turtle
- def tree(n):
- if n > 5:
- # 右边树
- turtle.forward(n), print("段1右树:前进",n,"---此时n的值为:",n)
- turtle.right(20), print("段1右树:右转 20","---此时n的值为:",n)
- print("段1右树:开始调用tree(n-15)","---此时n的值为:",n), tree(n-15) , print("段1右树:调用tree(n-15)结束","---此时n的值为:",n)
- # 这里画完右边树后,笔的位置应该在最右边顶点上,为什么不用写返回的语句,就可以直接画左边树?
- # 左边树
- turtle.left(40) , print("段2左树:左转 40","---此时n的值为:",n)
- print("段2左树:开始调用tree(n-15)","---此时n的值为:",n), tree(n-15) , print("段2左树:调用tree(n-15)结束","---此时n的值为:",n)
- # 返回
- turtle.right(20) , print("段3返回:右转 20","---此时n的值为:",n)
- turtle.backward(n) , print("段3返回:后退", n,"---此时n的值为:",n)
- def main():
- turtle.left(90)
- turtle.backward(40)
- tree(40)
- turtle.exitonclick()
- if __name__ == '__main__':
- main()
复制代码
段1右树:前进 40 ---此时n的值为: 40
段1右树:右转 20 ---此时n的值为: 40
段1右树:开始调用tree(n-15) ---此时n的值为: 40
段1右树:前进 25 ---此时n的值为: 25
段1右树:右转 20 ---此时n的值为: 25
段1右树:开始调用tree(n-15) ---此时n的值为: 25
段1右树:前进 10 ---此时n的值为: 10
段1右树:右转 20 ---此时n的值为: 10
段1右树:开始调用tree(n-15) ---此时n的值为: 10
段1右树:调用tree(n-15)结束 ---此时n的值为: 10
段2左树:左转 40 ---此时n的值为: 10
段2左树:开始调用tree(n-15) ---此时n的值为: 10 #哦, 原来这里左树未满足if语句条件,其实未执行,相当于先执行了下面的返回语句。
段2左树:调用tree(n-15)结束 ---此时n的值为: 10 #哦, 原来这里左树未满足if语句条件,其实未执行,相当于先执行了下面的返回语句。
段3返回:右转 20 ---此时n的值为: 10
段3返回:后退 10 ---此时n的值为: 10
段1右树:调用tree(n-15)结束 ---此时n的值为: 25
段2左树:左转 40 ---此时n的值为: 25
段2左树:开始调用tree(n-15) ---此时n的值为: 25
段1右树:前进 10 ---此时n的值为: 10
段1右树:右转 20 ---此时n的值为: 10
段1右树:开始调用tree(n-15) ---此时n的值为: 10
段1右树:调用tree(n-15)结束 ---此时n的值为: 10
段2左树:左转 40 ---此时n的值为: 10
段2左树:开始调用tree(n-15) ---此时n的值为: 10
段2左树:调用tree(n-15)结束 ---此时n的值为: 10
段3返回:右转 20 ---此时n的值为: 10
段3返回:后退 10 ---此时n的值为: 10
段2左树:调用tree(n-15)结束 ---此时n的值为: 25
段3返回:右转 20 ---此时n的值为: 25
段3返回:后退 25 ---此时n的值为: 25
段1右树:调用tree(n-15)结束 ---此时n的值为: 40
段2左树:左转 40 ---此时n的值为: 40
段2左树:开始调用tree(n-15) ---此时n的值为: 40
段1右树:前进 25 ---此时n的值为: 25
段1右树:右转 20 ---此时n的值为: 25
段1右树:开始调用tree(n-15) ---此时n的值为: 25
段1右树:前进 10 ---此时n的值为: 10
段1右树:右转 20 ---此时n的值为: 10
段1右树:开始调用tree(n-15) ---此时n的值为: 10
段1右树:调用tree(n-15)结束 ---此时n的值为: 10
段2左树:左转 40 ---此时n的值为: 10
段2左树:开始调用tree(n-15) ---此时n的值为: 10
段2左树:调用tree(n-15)结束 ---此时n的值为: 10
段3返回:右转 20 ---此时n的值为: 10
段3返回:后退 10 ---此时n的值为: 10
段1右树:调用tree(n-15)结束 ---此时n的值为: 25
段2左树:左转 40 ---此时n的值为: 25
段2左树:开始调用tree(n-15) ---此时n的值为: 25
段1右树:前进 10 ---此时n的值为: 10
段1右树:右转 20 ---此时n的值为: 10
段1右树:开始调用tree(n-15) ---此时n的值为: 10
段1右树:调用tree(n-15)结束 ---此时n的值为: 10
段2左树:左转 40 ---此时n的值为: 10
段2左树:开始调用tree(n-15) ---此时n的值为: 10
段2左树:调用tree(n-15)结束 ---此时n的值为: 10
段3返回:右转 20 ---此时n的值为: 10
段3返回:后退 10 ---此时n的值为: 10
段2左树:调用tree(n-15)结束 ---此时n的值为: 25
段3返回:右转 20 ---此时n的值为: 25
段3返回:后退 25 ---此时n的值为: 25
段2左树:调用tree(n-15)结束 ---此时n的值为: 40
段3返回:右转 20 ---此时n的值为: 40
段3返回:后退 40 ---此时n的值为: 40 |
|