Треугольник Серпинского
Фрактал, состоящий из треугольников с «вырезанной» серединой. На каждом уровне рекурсии треугольник делится на четыре части, и центральная остаётся пустой.
Разбор
Сначала перемещаем черепаху в начальную позицию (без рисования) и запускаем построение с глубиной 5 и размером стороны 240:
использовать Черепаха
алг
нач
поднять хвост
назад(140)
влево(90)
вперед(90)
вправо(90)
опустить хвост
серпинский(5, 240.0)
кон
Вспомогательный алгоритм маленький_треуг рисует один маленький равносторонний треугольник --- это базовый случай рекурсии. Цикл повторяется 3 раза: черепаха проходит вперёд и поворачивает на $120°$:
алг маленький_треуг(вещ side)
нач
цел i
нц для i от 0 до 2
вперед(side)
влево(120)
кц
кон
Основной алгоритм серпинский работает рекурсивно. Если глубина равна нулю, рисуем маленький треугольник. Иначе делим сторону пополам и строим три копии фрактала меньшего размера:
- Нижний левый --- рисуем на текущей позиции.
- Нижний правый --- сдвигаемся вправо на $side / 2$ и рисуем.
- Верхний --- возвращаемся, поднимаемся по диагонали и рисуем.
алг серпинский(цел n, вещ side)
нач
если n = 0 то
маленький_треуг(side)
иначе
серпинский(n - 1, side / 2.0) | нижний левый
вперед(side / 2.0)
серпинский(n - 1, side / 2.0) | нижний правый
назад(side / 2.0)
влево(60)
вперед(side / 2.0)
вправо(60)
серпинский(n - 1, side / 2.0) | верхний
влево(60)
назад(side / 2.0)
вправо(60)
все
кон
Центральный треугольник никогда не рисуется --- именно так возникает характерный «дырчатый» узор. Площадь фрактала стремится к нулю при увеличении глубины, а его фрактальная размерность равна $\log_2 3 \approx 1{,}585$.
Полная программа
использовать Черепаха
алг
нач
поднять хвост
назад(140)
влево(90)
вперед(90)
вправо(90)
опустить хвост
серпинский(5, 240.0)
кон
алг маленький_треуг(вещ side)
нач
цел i
нц для i от 0 до 2
вперед(side)
влево(120)
кц
кон
алг серпинский(цел n, вещ side)
нач
если n = 0 то
маленький_треуг(side)
иначе
серпинский(n - 1, side / 2.0)
вперед(side / 2.0)
серпинский(n - 1, side / 2.0)
назад(side / 2.0)
влево(60)
вперед(side / 2.0)
вправо(60)
серпинский(n - 1, side / 2.0)
влево(60)
назад(side / 2.0)
вправо(60)
все
кон