在python3上使用递归的分形树

用户5843394

我无法理解递归。main()函数对齐海龟。tree()函数被调用branchLen = 75因此,它通过了“if”条件并上升。根据我的理解,乌龟应该连续右转5次,长度依次递减为75、60、45、30、15。此后,它将不再满足“if”条件。代码只会运行到第 5 行(第一次递归调用)。因此,应该显示一条倾向于 RHS 的单行。不应该有任何左转弯。但这并没有发生,一个完全对称的树被制作出来了。请解释如何。
有关问题的更多信息,请参阅链接。
谢谢!
https://interactivepython.org/runestone/static/pythonds/Recursion/pythondsintro-VisualizingRecursion.html

def tree(branchLen,t):
    if branchLen > 5:
        t.forward(branchLen)
        t.right(20)
        tree(branchLen-15,t)
        t.left(40)
        tree(branchLen-15,t)
        t.right(20)
        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()
KGS

这不是真的,它没有向左旋转。请注意如何始终使用乌龟的同一实例进行绘制,因此乌龟总是从每次调用之前的位置继续。

def tree(branchLen,t, direction="straight"):
    if branchLen > 5:
        print branchLen, t.pos(), direction #debug info
        t.forward(branchLen)  #go forward branchlen
        t.right(20)           #rotate right 20
        tree(branchLen-15,t)  #call first branch of recursion
        t.left(40)            #rotate left 40 
        tree(branchLen-15,t)  #call second branch of recursion
        t.right(20)           #rotate right 20
        t.backward(branchLen) #go back branchlen - it is now reset to the original position before this call of tree
        print "reset to previous", t.pos()

所以基本上发生的是:

  1. 它像你期望的那样一直向右走——那是因为它向右旋转,然后它进入递归的第一个分支
  2. 它从这个分支开始浮出水面,这意味着向后到每个级别,然后调用第二个分支(这将使它在重新浮出水面之前再次“前进”,从而重复步骤 1 和 2)

您必须注意,当它出现时,它开始使用branchLen调用此分支的函数值,而 t 保持不变。这是调试信息的结果:

branchlen, position, direction called
75 (-0.00,-100.00) straight
60 (-0.00,-25.00) right
45 (20.52,31.38) right
30 (49.45,65.85) right
15 (75.43,80.85) right
0 (90.20,83.46) right # 0 does not draw
0 (90.20,83.46) left
reset to previous (75.43,80.85) #after this it will resurface 1 level, and repeat
15 (75.43,80.85) left
0 (85.07,92.34) right
0 (85.07,92.34) left
reset to previous (75.43,80.85)
reset to previous (49.45,65.85) #here it resurfaces twice
30 (49.45,65.85) left
15 (59.71,94.04) right
0 (69.35,105.54) right
0 (69.35,105.54) left
reset to previous (59.71,94.04)
15 (59.71,94.04) left
0 (59.71,109.04) right
0 (59.71,109.04) left
reset to previous (59.71,94.04)
reset to previous (49.45,65.85)
reset to previous (20.52,31.38)
45 (20.52,31.38) left
30 (20.52,76.38) right
15 (30.78,104.57) right
0 (40.42,116.06) right
0 (40.42,116.06) left
reset to previous (30.78,104.57)
15 (30.78,104.57) left
0 (30.78,119.57) right
0 (30.78,119.57) left
reset to previous (30.78,104.57)
reset to previous (20.52,76.38)
30 (20.52,76.38) left
15 (10.26,104.57) right
0 (10.26,119.57) right
0 (10.26,119.57) left
reset to previous (10.26,104.57)
15 (10.26,104.57) left
0 (0.62,116.06) right
0 (0.62,116.06) left
reset to previous (10.26,104.57)
reset to previous (20.52,76.38)
reset to previous (20.52,31.38)
reset to previous (0.00,-25.00)
60 (0.00,-25.00) left
45 (-20.52,31.38) right
30 (-20.52,76.38) right
15 (-10.26,104.57) right
0 (-0.62,116.06) right
0 (-0.62,116.06) left
reset to previous (-10.26,104.57)
15 (-10.26,104.57) left
0 (-10.26,119.57) right
0 (-10.26,119.57) left
reset to previous (-10.26,104.57)
reset to previous (-20.52,76.38)
30 (-20.52,76.38) left
15 (-30.78,104.57) right
0 (-30.78,119.57) right
0 (-30.78,119.57) left
reset to previous (-30.78,104.57)
15 (-30.78,104.57) left
0 (-40.42,116.06) right
0 (-40.42,116.06) left
reset to previous (-30.78,104.57)
reset to previous (-20.52,76.38)
reset to previous (-20.52,31.38)
45 (-20.52,31.38) left
30 (-49.45,65.85) right
15 (-59.71,94.04) right
0 (-59.71,109.04) right
0 (-59.71,109.04) left
reset to previous (-59.71,94.04)
15 (-59.71,94.04) left
0 (-69.35,105.54) right
0 (-69.35,105.54) left
reset to previous (-59.71,94.04)
reset to previous (-49.45,65.85)
30 (-49.45,65.85) left
15 (-75.43,80.85) right
0 (-85.07,92.34) right
0 (-85.07,92.34) left
reset to previous (-75.43,80.85)
15 (-75.43,80.85) left
0 (-90.20,83.46) right
0 (-90.20,83.46) left
reset to previous (-75.43,80.85)
reset to previous (-49.45,65.85)
reset to previous (-20.52,31.38)
reset to previous (0.00,-25.00)
reset to previous (0.00,-100.00)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用递归在Python中绘制分形树

来自分类Dev

使用递归在Python中绘制分形树

来自分类Dev

递归中的分形Pifagor树

来自分类Dev

在python中使用基本递归绘制分形时出错

来自分类Dev

WebGL中的递归分形2D树图

来自分类Dev

使用递归算法绘制分形

来自分类Dev

C#使用递归创建分形

来自分类Dev

使用元素树python3解析XML文件

来自分类Dev

Python 使用递归查找树的路径

来自分类Dev

在Python中绘制一棵分形树

来自分类Dev

Python递归族树

来自分类Dev

使用递归绘制树

来自分类Dev

如何使用pip在Python3上安装Flask?

来自分类Dev

在Linux上使用CRLF而不是LF的Python3 DictWriter

来自分类Dev

Bazel 0.26.1在py_test上使用Python3

来自分类Dev

签名以请求jwt在python3中的API上使用

来自分类Dev

在python3上安装/使用dask.array

来自分类Dev

在 Python3 上使用 Pandas 未对齐的数据框

来自分类Dev

python3上的UnicodeDecodeError

来自分类Dev

Cygwin上的Python3

来自分类Dev

如何在python3中使用AST递归简化数学表达式?

来自分类Dev

使用递归解释遍历二叉树(python)

来自分类Dev

在python中使用递归在通用树中查找节点

来自分类Dev

Javascript 在画布上绘制分形,递归保存和恢复问题

来自分类Dev

如何制作金色的分形树

来自分类Dev

构造分形树时的问题

来自分类Dev

需要帮助打印分形树

来自分类Dev

使用Python 3递归的问题

来自分类Dev

使用 python3 上的大块 (60MB) 在 SQLITE3 上缓慢更新