试图理解Levy曲线(分形)

时间:2013-05-30 19:05:50

标签: python fractals

我被要求实现一个递归函数,它以非负整数n作为输入并返回用字母L,R和F编码的turtle指令,其中L表示向左旋转45度,R表示向右旋转45度,F表示向前旋转

附加信息我有:对于每个非负整数n> 0,Levy曲线L(n)可以用Levy曲线L(n-1)来定义;征费曲线L(0)只是一条直线。

    usage:
    >>> lev(0)
    'F'
    >>> lev(1)
    'LFRRFL'

我对此非常陌生,我不知道如何开始:

到目前为止,我只得到了:

    from turtle import Screen, Turtle
    def lev(n):
        # base case
        if n ==0:
           return 'F'
        # recursive case
        else:
            return lev(n-1)

我在这里需要一些好的指示。

3 个答案:

答案 0 :(得分:5)

由于Levy CL system只有一条规则,因此使用单replace方法构建结果字符串很简单。

def lev(n):
    if n == 0:
        return "F"
    else:
        symbols = lev(n-1)
        return symbols.replace("F", "LFRRFL")

for i in range(4):
    print lev(i)

结果:

F
LFRRFL
LLFRRFLRRLFRRFLL
LLLFRRFLRRLFRRFLLRRLLFRRFLRRLFRRFLLL

您可以通过想象图中的每条直线被以90度角连接的两条较小的线代替来可视化这种替换。像这样:

enter image description here

答案 1 :(得分:1)

首先,如果这是问题:一个大的Levy曲线(递归情况)是通过在房间内安排两个彼此相对的较小的一个来构建的,其中两个“在地板上”面朝上,在两者之间。一条小Levy曲线(基本情况)只是一条直线。事实上,基本情况是:

def lev(n):
    if n == 0:
        return 'F'
    else:
        # Recursive case here

但是对于递归情况,你​​只需要调用lev(n-1)。你是对的,你需要这样做,但你需要做四次,然后在两者之间旋转。这将创建所需的'两条彼此面对的较小曲线,其间有两条'。

仔细检查曲线(这里:https://en.wikipedia.org/wiki/File:Levy_C_construction.png),我们看到我们需要绘制一条曲线,然后向右转,然后绘制另一条曲线,然后完全转动,然后绘制第三条曲线,最后,右转并绘制最终曲线。

这可以相当简单地完成:

dev lev(n):
    if n == 0:
        # Base case
        return 'F'
    else:
        # Recursive case
        # Calculate the smaller curve
        smaller = lev(n-1)
        # Add in the turning in between the smaller curves
        final = smaller        # First curve
        if n%2 == 0:           # Even depths require right turns
            final += 'RR'        # Rotate 90 degrees
            final += smaller     # Second curve
            final += 'RRRR'      # Rotate 180 degrees
            final += smaller     # Third curve
            final += 'RR'        # Rotate 90 degrees
            final += smaller     # Final curve
        else:                  # Odd depths require left turns
            final += 'LL'        # Rotate 90 degrees
            final += smaller     # Second curve
                                 # (No full rotation in odd depths)
            final += smaller     # Third curve
            final += 'LL'        # Rotate 90 degrees
            final += smaller     # Final curve
        return final           # Done!

答案 2 :(得分:0)

我的答案

import turtle

def draw(n):
    l=10
    if n == 0:
        turtle.forward(l)
    else:
         turtle.left(45)
         draw(n - 1)
         turtle.right(45)
         turtle.right(45)
         draw(n-1)
         turtle.left(45)

draw(12)