ThinkPython练习5.4科赫曲线

时间:2014-12-25 17:56:41

标签: python-2.7

我不明白如何使用此函数绘制Koch曲线。

def koch(t, n):
    """Draws a koch curve with length n."""
    if n<3:
        fd(t, n)
        return
    m = n/3.0
    koch(t, m)
    lt(t, 60)
    koch(t, m)
    rt(t, 120)
    koch(t, m)
    lt(t, 60)
    koch(t, m)

fd(t,n)命令表示对象&#39; t&#39;将按金额向前推进&#39; n&#39;。 rt(t,120)和lt(t,60)命令意味着对象&#39; t&#39;将以给定的角度向右或向左转。

所以我认为作者在函数中使用了递归,但我不明白它是如何重复这么多次,因为我是初学者并且逻辑技能非常有限。

作为一个例子,我称之为koch(t,100),if子句被传递为n&gt; 3导致下一行代码为m / 3.0,因此100 / 3.0为33.3。然后,这导致koch(t,33.3)并且n> 3仍然认为它再次重申产生koch(t,11.1)等等,直到我们重申它为止,直到我们来到koch(t,1.23)。

现在n = 1.23,并且只要n <1,if子句就会激活。 3我们可以运行if条件代码块,用fd(t,1.23)替换所有koch(t,m)语句。正如我所看到的那样fd(),lt(),fd(),rt(),fd,lt(),fd()应该只被激活一次,因为n&lt; 3一旦n = 1.23或者它再次以1.23 / 3.0再次重复,代码再次用koch(t,0.41)运行?也许是因为一个else子句不存在来取消函数,但是函数确实结束了,如果我为n选择更高的值,koch曲线也更大,这让我更加困惑,因为在那里我看不到代码中的任何一行告诉我重复这个功能n次。

我为缺乏清晰度而道歉,因为我不明白如何清楚地解释这一点。

2 个答案:

答案 0 :(得分:0)

我认为你可能会从错误的一端看这个尝试解决它。首先考虑一下如果拨打koch(t,1)会发生什么。 if语句的计算结果为false,您可以看到绘制了类似的内容:

_/\_

现在如果你致电koch(t,3)怎么办?试试一张纸,你会发现上面图片中的每条直线都被相似的形状所取代......

答案 1 :(得分:0)

在阅读了关于递归和测试控制台中的一些print语句之后,我发现了我的问题。我不明白的是为什么选择更大的n(长度)会产生更大的分形。基本上因为选择较大的n在递归树上产生更多节点(子节点),因此当n <1时,选择更大的n将产生更多的子节点并且仅产生最后的节点(空节点)。如果n很大,那么龟将开始绘制,并且此时会有许多空节点。

为了理解递归,甚至进一步包括当这个问题提出的代码块中有两个或更多递归函数时递归是如何工作的,我已经包含了一个指向有用线程的链接,并希望它可以帮助其他任何被困在这个问题上的人问题和需求有助于理解递归。

Understanding recursion