Найдите пару треугольников, максимально удаленных друг от друга - Lisp
Формулировка задачи:
Помогите пожалуйста.
Надо написать функцию с использованием рекурсии.
Пусть дано множество треугольников, заданных координатами своих вершин. Найдите пару треугольников, максимально удаленных друг от друга.
Решение задачи: «Найдите пару треугольников, максимально удаленных друг от друга»
textual
Листинг программы
- ;; центр треугольника
- (defun center (x1 y1 x2 y2 x3 y3)
- (list (/ (+ x1 x2 x3) 3.0) (/ (+ y1 y2 y3) 3.0)))
- ;; Расстояние между центрами треугольников
- (defun dist (p1 p2)
- (let ((n1 (car p1))
- (n2 (car p2))
- (x1 (cadr p1))
- (x2 (cadr p2))
- (y1 (caddr p1))
- (y2 (caddr p2)))
- (list (list n1 n2) (+ (^ (- x1 x2) 2) (^ (- y1 y2) 2)))))
- ;; Решение:
- (defun task (lst)
- (let* ((n (length lst))
- (lc (mapcar (lambda (a) (apply 'center a)) lst))
- (nc (mapcar 'cons (range 1 n) lc))
- (dc (apply 'append (mapcar (lambda (p)
- (mapcar (lambda (q) (dist p q)) nc)) nc)))
- (dm (apply 'max (mapcar 'cadr dc)))
- (mm (remove-if (lambda (x) (> (abs (- dm (cadr x))) 0.00001)) dc)))
- (caar mm)))
- (task '((0 0 1 0 0 1) (5 5 7 6 10 11) (-2 -2 -1 -1 -6 -7)))
- ==> (2 3) ;; максимально расстояние между вторым и третьим
Объяснение кода листинга программы
В данном коде на языке Lisp реализуется задача поиска пары треугольников, максимально удалённых друг от друга.
- В функции center(x1,y1,x2,y2,x3,y3) вычисляются координаты центра треугольника по формулам геометрии.
- В функции dist(p1,p2) вычисляется расстояние между центрами треугольников по формуле Евклида с использованием функций из библиотеки CL-Math.
- В функции task(lst) осуществляется решение задачи: — Создаётся список length lst, содержащий количество треугольников. — Создаётся список lc, содержащий координаты центров треугольников, вычисленные с помощью функции center и переданные в качестве аргумента каждому элементу списка lst. — Создаётся список nc, содержащий кортежи (номер треугольника, координаты центра треугольника). — Создаётся список dc, содержащий матрицу расстояний между центрами треугольников. Вычисляется с помощью функции apply 'append и mapcar (lambda (p) (mapcar (lambda (q) (dist p q)) nc)) nc). — Создаётся список dm, содержащий диагональ матрицы расстояний между центрами треугольников. Вычисляется с помощью функции apply 'max и mapcar 'cadr dc). — Создаётся список mm, содержащий только те элементы списка dm, значение которых больше заданной точности. — В результате выводится пара чисел — номер треугольника и значение из списка mm, соответствующие максимально удалённым центрам треугольников. Пример вызова функции task с тестовым списком: (task '((0 0 1 0 0 1) (5 5 7 6 10 11) (-2 -2 -1 -1 -6 -7))) Вывод: (2 3)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д