Рекурсия · 16 из 20
Кривая Гильберта
Давид Гильберт в 1891 году придумал линию, которая проходит через каждую клетку квадрата ровно по разу и ни разу себя не пересекает. Устроена она как матрёшка: кривая уровня n — это четыре кривые уровня n − 1 в четырёх четвертях квадрата, нижние две повёрнуты, и между ними — три коротких перехода. Ею до сих пор раскладывают картинки в памяти: соседние точки на кривой — соседние и на плоскости.
Что сделать
Нарисуйте черепашкой кривую Гильберта заданного уровня: четыре кривые уровнем ниже и три перехода между ними.
Что приходит
t— черепашка: стоит в начале, смотрит на восток, перо опущеноuroven— уровень кривой, от 0shag— длина одного перехода
Что вернуть
Ничего — функция рисует. Проверка сравнивает нарисованное с рисунком эталона.
Допишите функцию gilbert в редакторе справа.
Рисуйте черепашкой t, как turtle дома, — проверка
сравнивает нарисованное; возвращать ничего не нужно.
с графикой когда тесты пройдут, ответ вашей функции нарисуется · все задачи с графикой
Уровень 1 с шагом 20 — буква «П» вверх ногами: направо на 90°, вперёд, налево на 90°, вперёд, налево на 90°, вперёд, направо на 90°. Черепашка спускается на 20, идёт на 20 вправо и поднимается обратно. Уровень 2 — четыре такие «П», соединённые тремя переходами.
Удобнее всего — вспомогательная рекурсивная функция с углом поворота ugol: у самой кривой он 90, а у повёрнутых частей — с другим знаком. Кривая уровня n с углом ugol:
- направо на
ugol; - кривая уровня
n − 1с углом−ugol; - вперёд на
shag, налево наugol; - кривая уровня
n − 1с угломugol; - вперёд на
shag; - кривая уровня
n − 1с угломugol; - налево на
ugol, вперёд наshag; - кривая уровня
n − 1с углом−ugol; - направо на
ugol.
Уровень 0 не рисует ничего. Поворот налево на отрицательный угол — это поворот направо, как у настоящей черепашки.
Сравнивается картинка, а не команды: другой порядок обхода, дающий ту же линию, засчитывается. Зеркальная кривая — другой рисунок.
Образцовый тест целиком
from cherepashka import risunok as _risunok_p
_risunok_p(gilbert, 2, 20)
<рисунок: 13 линий, 1 цвет; от (0, -60) до (60, 0); отпечаток 7e9d1f7c02>
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.