Умножение многочленов - Lisp
Формулировка задачи:
Здравствуйте, помогите пожалуйста реализовать на Lisp'е данный код
Заранее спасибо
domains int=integer intl=int* predicates len(intl,int) elt(intl,int,int) pcoeff(intl,intl,int,int,int) coeff(intl,intl,int,int,int) poly_mult(intl,intl,int,intl) polymult(intl,intl,intl) clauses len([],0). len([_|T],N) :- len(T,N1), N=N1+1. elt([],_,0) :- !. elt([X|_],0,X) :- !. elt([_|T],N,X) :- N1=N-1, elt(T,N1,X). pcoeff(PX,PY,I,J,Q) :- elt(PX,I,XX), elt(PY,J,YY), Q=XX*YY. coeff(_,_,N,I,0) :- I>N, !. coeff(PX,PY,N,I,S) :- J=N-I, pcoeff(PX,PY,I,J,Q), I1=I+1, coeff(PX,PY,N,I1,S1), S=S1+Q. poly_mult(PX,PY,I,[]) :- len(PX,N1), len(PY,N2), N=N1+N2-2, I>N, !. poly_mult(PX,PY,I,[Q|T]) :- coeff(PX,PY,I,0,Q), I1=I+1, poly_mult(PX,PY,I1,T). polymult(PX,PY,R) :- poly_mult(PX,PY,0,R).
Решение задачи: «Умножение многочленов»
textual
Листинг программы
(defun poly-add (p1 p2) (let* ((n1 (- (length p1) 1)) (n2 (- (length p2) 1)) (n (max n1 n2)) (res nil)) (iter (for i from 0 to n) (cond ((and (<= i n1) (<= i n2)) (collecting (+ (nth i p1) (nth i p2)) into res)) ((<= i n1) (collecting (nth i p1) into res)) (t (collecting (nth i p2) into res)))) res)) ==> poly-add (defun poly-by-mon (p c m) ;; с-коэфф, m-степень (append (replicate 0 m) (mapcar #'(lambda (q) (* c q)) p))) ==> poly-by-mon (defun poly-mult (p1 p2 &optional (c 0) (r (list 0))) (cond ((null p1) r) (t (let ((pp2 (poly-by-mon p2 (car p1) c))) (poly-mult (cdr p1) p2 (+ c 1) (poly-add r pp2)))))) ==> poly-mult (poly-mult '(1 1) '(1 -1)) ==> (1 0 -1) (poly-mult '(1 1) '(1 1)) ==> (1 2 1)
Объяснение кода листинга программы
В данном коде представлена реализация функции poly-mult
, которая выполняет умножение двух многочленов.
Список вызовов функций и переменных:
poly-add
- функция сложения многочленовpoly-by-mon
- функция создания многочлена из другого многочлена по коэффициенту и степениreplicate
- функция создания списка одинаковых элементовmapcar
- функция применения функции к каждому элементу спискаpoly-mult
- функция умножения многочленовnull
- функция проверки на пустоту спискаcar
- функция получения первого элемента спискаcdr
- функция получения списка без первого элементаpoly-add
- функция сложения многочленовpoly-by-mon
- функция создания многочлена из другого многочлена по коэффициенту и степениreplicate
- функция создания списка одинаковых элементовmapcar
- функция применения функции к каждому элементу спискаpoly-mult
- функция умножения многочленовc
- переменная для хранения коэффициентаr
- переменная для хранения результата умножения многочленов Давайте рассмотрим каждый из представленных функций:poly-add
- функция сложения многочленов. Функция принимает два многочленаp1
иp2
и возвращает их сумму. Внутри функции определяются переменныеn1
иn2
, которые хранят длины многочленовp1
иp2
соответственно. Затем определяется переменнаяn
, которая хранит максимальную из длинn1
иn2
. Далее, с помощью циклаiter
происходит итеративное сложение соответствующих элементов многочленовp1
иp2
с использованием функцииcollecting
для накопления результата в переменнойres
. В конце функция возвращает значениеres
.poly-by-mon
- функция создания многочлена из другого многочлена по коэффициенту и степени. Функция принимает многочленp
, коэффициентc
и степеньm
и возвращает новый многочленq
, в котором каждый элементq
равенc
умноженному на соответствующий элементp
с учетом его степени. Для этого используется функцияreplicate
, которая создает список одинаковых элементов, и функцияmapcar
, которая применяет функцию к каждому элементу списка.poly-mult
- функция умножения многочленов. Функция принимает два многочленаp1
иp2
и возвращает их произведение. Еслиp1
равноnil
(т.е. пустой список), то возвращаетсяr
, иначе выполняется следующее: создается новый многочленpp2
изp2
с использованием коэффициентаc
и степениm
с помощью функцииpoly-by-mon
. Затем рекурсивно вызывается функцияpoly-mult
дляcdr
p1
иpp2
, а результат сохраняется в переменнойr
. Значениеc
увеличивается на 1. В приведенном примере кода вызывается функцияpoly-mult
с двумя многочленами(1 1)
и(1 -1)
. Результатом выполнения будет(1 0 -1)
, так как умножение многочленов(1 1)
и(1 -1)
дает(1 0 -1)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д