2013-05-30 14 views
0

Меня попросили реализовать рекурсивную функцию, которая принимает неотрицательное целое число n в качестве входных данных и возвращает инструкцию черепахи с буквами L, R и F, где L означает поворот влево на 45 градусов, R означает поверните направо 45, а F - вперед.Попытка понять кривую Леви (фрактал)

Дополнительная информация i i: для каждого неотрицательного целого n> 0 кривая Леви L(n) может быть определена в терминах кривой Леви 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) 

мне нужны хорошие указатели здесь, пожалуйста.

+0

когда 'n' не '0' вы, вероятно, хотите сделать что-то, кроме просто позвонить' н-1'. возможно, что-то вроде 'return 'L% sRR% sL'% (lev (n-1), lev (n-1))' – cmd

+0

им жаль, что это значит? 'L% sRR% sL' - как то, что есть 'и почему вы mod' L 'с' s ' – Snarre

+0

В дополнение к модулю '%' также может использоваться для форматирования содержимого строки: см. [Старый форматирование строки] (http://docs.python.org/2/tutorial/inputoutput.html#old-string-formatting). Но [str.format] (http://docs.python.org/3/library/stdtypes.html?highlight=format#str.format) - это то, что используют все _cool_ разработчики, в эти дни :-) – Kevin

ответ

5

С Levy C «s L 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 

Вы можете визуализировать эту замену, представляя каждую прямую линию на рисунке заменяется двумя меньшими линиями, соединенных под углом девяносто градусов. Как так:

enter image description here

+0

, поэтому я в основном заменяю F на LFRRFL recursivelly? – Snarre

+0

Да, это традиционно, как построена кривая Леви С. – Kevin

+0

oh сейчас я вижу :) поэтому каждая прямая линия преобразуется в соответствии с фиксированным рисунком? – Snarre

1

Во-первых, в случае, если это проблема: большая кривая Леви (рекурсивный корпус) построена путем расположения двух меньших друг к другу «по комнате», а еще две «на полу» вверх, между , Небольшая кривая Леви (базовый регистр) - это просто прямая линия. Так, действительно, базовый случай:

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

Но для рекурсивного случае, вы просто должны это называть лева (п-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! 
+0

, но я не получу никаких поворотов здесь. Мне нужно привести следующие результаты: >>> lev (1) 'LFRRFL' – Snarre

+0

@Snarre Oh oops! Я кое-что посмотрел на фрактал: некоторые глубины требуют правильных поворотов, а некоторые требуют левого. Я смотрел только на один уровень глубины. Lemme исправить это ... – MegaWidget

+0

@Snarre Done! Спасибо, что комментировали проблему, а не просто голосуйте за мой ответ и оставляете ее :) – MegaWidget

Смежные вопросы