Вам предлагается следующий вариант: складывая лист пополам, мы получаем две половины дракона — правую и левую. Если внимательно посмотреть на исходные рисунки, то можно заметить, что при дальнейшем складывании каждая из частей делится на правую и левую. Разница в том, что правые части согнуты по часовой стрелке, а левые — против.
Программа на Лого (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).