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
   66   67   68   69   70   71   72   73   74   75   76