Page 71 - AutoLISP и Visual LISP в среде AutoCAD
P. 71
4. РЕКУРСИЯ. РЕКУРСИВНЫЕ ФУНКЦИИ. ФРАКТАЛЫ
Рассмотрим, как реализуется в AutoLisp один из самых интересных
механизмов – рекурсия. Рекурсия – это такая организация алгоритма, при
которой функция обращается к самой себе.
Механизм рекурсии позволяет решать многие задачи, обеспечивая
очень компактный код. Рассмотрим пример вычисления факториала с
использованием рекурсивной функции. Напомним, что факториал
натурального числа n определяется как произведение всех натуральных
чисел от 1 до n включительно.
(defun factorial (N) (if (= N 1) 1
(* N (factorial (- N 1)))
);if
);defun
Вычисление факториала происходит по следующей схеме
5! ® 5 × 4!,
4! ® 4 × 3!,
3! ® 3 × 2!,
2! ® 2 × 1!,
1! ® 1.
Рассмотрим рекурсивный механизм на примере фракталов.
Фрактал – объект, в точности или приближённо совпадающий с частью
себя самого, то есть целое имеет ту же форму, что и одна или более частей.
Многие объекты в природе обладают свойствами фрактала, например:
снежинки, кроны деревьев, кровеносная система человека и животных, а
также ряд других объектов живой и неживой природы.
Примером фрактала, где объект в точности совпадает с частью самого
себя, является фрактал СНЕЖИНКА. Обратите внимание, на возможность
изменять число лучей и количество подуровней. Результат работы
программы представлен на рис.6.
;************ Функция СНЕЖИНКА ************
(defun Sneg (x y size / i j newsize xnew ynew step lst new_lst)
(setq step (* 0.2 Pi))
(if (< size 1)
(progn
(setq lst '((0 . "CIRCLE") (67 . 0) (62 . 170) (8 . "0")
(10 x y 0.0) (40 . 0.20) (62 . 170) (210 0.0 0.0 1.0)))
(setq new_lst (subst (list 10 x y 0.0) '(10 x y 0.0) lst))
(entmake new_lst)
);progn
(progn
(setq i 0)
(repeat 10 ; число лучей снежинки
70