Создание фрактальных квадратов с помощью рекурсии

Я изучаю рекурсию и хочу добиться этого в Python (черепаха):

Фрактальные кубы

Я сделал рекурсивную функцию, в которой я рисую квадрат, начиная с нижнего левого угла, лицом к востоку. Я могу получить квадраты на одной из сторон правильно, но не на другой.

Движение назад перед рисованием меньшего квадрата дает странные результаты:

Нечетные результаты

from turtle import *
delay(0)
speed(10)

def square(length, level):
if level == 0:
    return
else:
    # Start from the bottom-left corner
    forward(length)
    # Right square
    square(length // 2, level - 1)
    lt(90)

    forward(length)
    lt(90)

    forward(length)
    lt(90)

    forward(length)
    lt(90)

    ### Try moving backward before drawing
    ##backward(length / 2)

    # Left square
    square(length // 2, level - 1)

square(110, 4)

Какие-нибудь советы или хорошие примеры для изучения этих видов фракталов?


person Tom Smith    schedule 02.01.2016    source источник


Ответы (1)


При рисовании фрактала с помощью turtle следует соблюдать осторожность в отношении следующих моментов:

  1. Где функция должна начинаться (в вашем случае вы указываете «нижний левый угол»).
  2. Где он останавливается (?) - Позиция и ориентация! Это неясно в вашем коде, и поэтому он не работает.

В вашем коде две проблемы:

  • Вы должны переместить backward(length // 2), чтобы правильно начать отрисовку левого квадрата (как вы сделали в комментарии)
  • Вы должны вернуться туда, откуда начали квадрат (нижний левый угол большого квадрата).

Вот код с некоторыми комментариями:

def square(length, level):
    # Start from the bottom-left corner    
    if level == 0:
        return
    else:
        # Draw the bottom side
        forward(length)
        # Draw the right square
        square(length // 2, level - 1)
        # Assume we ended at the same position
        # Draw the right side
        lt(90); forward(length)
        # Draw the upper side
        lt(90); forward(length)
        # Draw the left side
        lt(90); forward(length)
        # Go backward
        lt(90); backward(length // 2) ;
        # Draw the left square
        square(length // 2, level - 1)
        # Go back to the original position
        forward(length // 2)

По сути, вы пропустили последний forward(length // 2), который перемещает черепаху в исходное положение.

person Holt    schedule 02.01.2016