Написать функцию для приведения подобных в данном многочлене - 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

Объяснение кода листинга программы

  1. Ввод полинома:
    • Функция input-poly принимает полином в качестве входного параметра и использует его для инициализации переменных x, res, sign, coef, u.
    • Переменная x содержит список коэффициентов полинома.
    • Переменная res содержит результат - список списков, представляющих полином в виде разности степеней переменной x.
    • Переменная sign содержит знак коэффициента при переменной x в текущем члене полинома.
    • Переменная coef содержит абсолютный значение коэффициента при переменной x в текущем члене полинома.
    • Переменная u используется для отслеживания неотрицательности коэффициента при переменной x в текущем члене полинома.
  2. Вывод полинома:
    • Функция output-poly принимает полином в качестве входного параметра и использует его для инициализации переменных x, res, i, c, p.
    • Переменная x содержит список переменных i, которые представляют коэффициенты полинома.
    • Переменная res содержит результат - список списков, представляющих полином в виде разности степеней переменной x.
    • Переменная i используется для итерации по коэффициентам полинома.
    • Переменная c содержит абсолютный значение коэффициента при переменной x в текущем члене полинома.
    • Переменная p содержит степень переменной x в текущем члене полинома.
  3. Приведение подобных:
    • Функция reduce-poly принимает полином в качестве входного параметра и использует его для инициализации переменных x, res, i, c, p, cc, lstp.
    • Переменная x содержит список переменных i, которые представляют коэффициенты полинома.
    • Переменная res содержит результат - список списков, представляющих полином в виде разности степеней переменной x.
    • Переменная i используется для итерации по коэффициентам полинома.
    • Переменная c содержит абсолютный значение коэффициента при переменной x в текущем члене полинома.
    • Переменная p содержит степень переменной x в текущем члене полинома.
    • Переменная cc используется для хранения суммы абсолютных значений коэффициентов при переменной x в текущем члене полинома.
    • Переменная lstp используется для хранения списка членов полинома, которые еще не были учтены.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.667 из 5
Похожие ответы