Кривая дракона — одна из задач фрактальной геометрии. Кривая замечательна тем, что не имеет самопересечений. Лучший язык для задач подобного рода — Лого. Существует множество решений этой задачи (см., например, “Информатику” № 20 за этот год).

Вам предлагается следующий вариант: складывая лист пополам, мы получаем две половины дракона — правую и левую. Если внимательно посмотреть на исходные рисунки, то можно заметить, что при дальнейшем складывании каждая из частей делится на правую и левую. Разница в том, что правые части согнуты по часовой стрелке, а левые — против.

Программа на Лого (LogoWriter, ЛогоМиры, MSWLogo):

to D_RIGHT :L :S

ifelse :L < :S [fd :L]

[D_RIGHT :L / 2 :S rt 90 D_LEFT :L / 2 :S]

end

to D_LEFT :L :S

ifelse :L < :S [fd :L]

[D_RIGHT :L / 2 :S lt 90 D_LEFT :L / 2 :S]

end

Две процедуры связаны косвенной рекурсией. Для построения кривой можно вызывать любую из них.

Вообще подобными кривыми (в их число входят деревья, снежинки Коха и Мандельброта и многие другие) можно иллюстрировать нетерминальную рекурсию — множественные рекурсивные вызовы.

Посмотрите на результат (drag1.gif). Этот “лист бумаги” в разглаженном состоянии имеет длину более 32000 пиксел, т. е. 32 экрана или около 8 метров (если у вас разрешение 1024х768).

А если этот же лист сложить еще пару раз, то получится такой крошка-дракончик (drag2.gif).

"Авторский" вариант на Паскале (obr8.pas) — просто перевод с Лого. В качестве второго образца предлагается также очень лаконичный вариант С. Савчука (probl08.pas).