Найти скалярное произведение векторов - Lisp
Формулировка задачи:
Сформировать в виде файла два вектора размерности не более 8, найти их скалярное произведение и ответ записать в файл
есть нечто похожее для разности двух векторов
Файлы для входных данных.
Файл v1.txt : (1 2 3 4 5 6 0 8)
Файл v2.txt : (1 0 3 4 5 6 7 8)
Файлы с выходными данными.
Файл out.txt : (0 2 0 0 0 0 -7 0)
(defun lab3 () (setq f1 (open "~/v1.txt")) (setq v1 (read f1)) (close f1) (setq f2 (open "~/v2.txt")) (setq v2 (read f2)) (close f2) (setq f3 (open "~/out.txt" :direction :output)) (if (= (len v1) (len v2)) (setq res (sub-vect v1 v2)) ) (print res f3) (close f3) ) (defun sub-vect (v1 v2) (mapcar (lambda (x) (apply '- x)) (mapcar 'list v1 v2))) (defun len (L) (loop for i in L sum 1))
Решение задачи: «Найти скалярное произведение векторов»
textual
Листинг программы
(apply '+ (mapcar '* v1 v2))
Объяснение кода листинга программы
В данном коде используется функция apply, которая применяет функцию, указанную в первом аргументе, к списку аргументов, указанных в последующих аргументах. В данном случае функция + будет применена к каждому элементу списка, который был получен с помощью функции mapcar, которая применяет функцию * к каждому элементу векторов v1 и v2. Таким образом, результатом выполнения данного кода будет скалярное произведение векторов v1 и v2.
Список элементов кода:
(apply '+ (mapcar '* v1 v2))- начало кодаv1иv2- векторы, скалярное произведение которых необходимо найти(mapcar '* v1 v2)- результат применения функции*к каждому элементу векторовv1иv2apply '+- применение функции+к каждому элементу списка, полученного на предыдущем шаге- Результат выполнения кода - скалярное произведение векторов
v1иv2