Написать функцию для приведения подобных в данном многочлене - 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
используется для хранения списка членов полинома, которые еще не были учтены.
- Функция
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д