Разработка программы на языке LISP для построения кривых Серпинского i-го порядкаНеобходимо выяснить, какова рекурсивная схема этих кривых. Рисунок SEQ Рисунок * ARABIC 2 Главная особенность кривой Серпинского состоит в том, что она замкнута и в ней нет пересечений. Это означает, что основная рекурсивная схема должна давать разомкнутую кривую линию, четыре части которой соединяются линиями, не принадлежащими самому рекурсивному образу. И действительно, эти замыкающие линии представляют собой отрезки прямых в четырех внешних углах, на рисунке 2 они выделены жирными линиями. Можно считать, что они принадлежат к непустой начальной кривой S – квадрату, «стоящему» на одном углу. Теперь достаточно легко составить рекурсивную схему. Четыре составляющих образа, для наглядности, обозначим через A , B, C, D, а процедуры, рисующие соединительные прямые, будем обозначать стрелками, указывающими соответствующем направлении. Надо отметить, что четыре рекурсивных образа по существу идентичны, но лишь повертываются на 90 ° . Основной образ кривых Серпинского задается схемой: S: A B C D а рекурсивные составляющие (горизонтальные и вертикальные отрезки – двойной длины): A: A B D A B: B C A B C: C D B C D: D A C D Предположим, что для построения части прямой в нашем распоряжении есть процедура Line , передвигающая перо в заданном направлении на заданное расстояние, причем направление задается целочисленным параметром i , как градусов. Если единичную прямую обозначить через h , то с помощью рекурсивных обращений к аналогично составленным процедурам для B и D и к самой A довольно просто написать процедуру, соответствующую схеме А. ( defun A ( k ) ( cond ( ( > k 0 ) ( A ( - k 1 ) ) ( Line 1 h ) ( B ( - k 1 ) ) ( Line 0 ( * 2 h ) ) ( D ( - k 1 ) ) ( Line 7 h ) ( A ( - k 1 ) )))) Эта процедура инициируется главной программой по одному разу для каждой кривой Серпинского, образующих приведенный рисунок. |