Написать функцию для приведения подобных в данном многочлене - Lisp
Формулировка задачи:
Многочлен в «традиционной» инфиксной записи задан в виде списка из текстовых элементов (возведение в степень обозначается знаком ^). Написать функцию для приведения подобных в данном многочлене.
Помогите, пожалуйста!
Решение задачи: «Написать функцию для приведения подобных в данном многочлене»
textual
Листинг программы
;; Ввод полинома (defun input-poly (p &aux (x (explode p)) res i (f 0) (sign 1) (coef 0) (u 0)) (dolist (i x res) (cond ((EQ i '+) (when (and (= u 0) (= f 1)) (setq u 1)) (if (> f 0) (setq res (append res (list (list coef u)))) (setq res (append res (list (list u 0))))) (setq sign 1 u 0 f 0 coef 0)) ((EQ i '-) (when (and (= u 0) (= f 1)) (setq u 1)) (if (> f 0) (setq res (append res (list (list coef u)))) (setq res (append res (list (list u 0))))) (setq sign -1 u 0 f 0 coef 0)) ((fixedp i) (setq u (+ i (* u 10)))) ((EQ i 'x) (when (= u 0) (setq u 1)) (setq f 1 coef (* sign u) u 0)) ((EQ i '^) (setq f 2)))) (cond ((= f 0) (setq res (append res (list (list (* sign u) 0))))) (t (setq res (append res (list (list coef u)))))) (qsort-b (remove '(0 0) res) #'(lambda (x y) (> (cadr x) (cadr y))))) ;; Вывод полинома (defun output-poly (x &aux i c p res) (dolist (i x (implode res)) (setq c (car i)) (setq p (cadr i)) (when (and (> c 0) (not (null res))) (setq res (append res (list '+)))) (when (< c 0) (setq res (append res (list '-))) (setq c (abs c))) (when (and (= c 1) (null res)) (setq res (append res (list 1)))) (when (<> c 1) (setq res (append res (list c)))) (cond ((> p 1) (setq res (append res (list 'x '^ p)))) ((= p 1) (setq res (append res (list 'x))))))) ;; Приведение подобных (defun reduce-poly (x &aux i c p cc cp res lstp) (dolist (i x (qsort-b res #'(lambda (x y) (> (cadr x) (cadr y))))) (setq cc 0) (setq p (cadr i)) (dolist (j x t) (setq cp (cadr j)) (when (= cp p) (setq cc (+ cc (car j))))) (when (and (<> cc 0) (not (memb p lstp))) (setq res (append res (list (list cc p)))) (setq lstp (cons p lstp))))) (output-poly (reduce-poly (input-poly '2+x^3-6x^2+12x^4+11x-7x^3))) ==> 2+11X-6X^2-6X^3+12X^4
Объяснение кода листинга программы
- Ввод полинома:
- Функция
input-polyпринимает полином в качестве входного параметра и использует его для инициализации переменныхx,res,sign,coef,u. - Переменная
xсодержит список коэффициентов полинома. - Переменная
resсодержит результат - список списков, представляющих полином в виде разности степеней переменнойx. - Переменная
signсодержит знак коэффициента при переменнойxв текущем члене полинома. - Переменная
coefсодержит абсолютный значение коэффициента при переменнойxв текущем члене полинома. - Переменная
uиспользуется для отслеживания неотрицательности коэффициента при переменнойxв текущем члене полинома.
- Функция
- Вывод полинома:
- Функция
output-polyпринимает полином в качестве входного параметра и использует его для инициализации переменныхx,res,i,c,p. - Переменная
xсодержит список переменныхi, которые представляют коэффициенты полинома. - Переменная
resсодержит результат - список списков, представляющих полином в виде разности степеней переменнойx. - Переменная
iиспользуется для итерации по коэффициентам полинома. - Переменная
cсодержит абсолютный значение коэффициента при переменнойxв текущем члене полинома. - Переменная
pсодержит степень переменнойxв текущем члене полинома.
- Функция
- Приведение подобных:
- Функция
reduce-polyпринимает полином в качестве входного параметра и использует его для инициализации переменныхx,res,i,c,p,cc,lstp. - Переменная
xсодержит список переменныхi, которые представляют коэффициенты полинома. - Переменная
resсодержит результат - список списков, представляющих полином в виде разности степеней переменнойx. - Переменная
iиспользуется для итерации по коэффициентам полинома. - Переменная
cсодержит абсолютный значение коэффициента при переменнойxв текущем члене полинома. - Переменная
pсодержит степень переменнойxв текущем члене полинома. - Переменная
ccиспользуется для хранения суммы абсолютных значений коэффициентов при переменнойxв текущем члене полинома. - Переменная
lstpиспользуется для хранения списка членов полинома, которые еще не были учтены.
- Функция