Написать функцию для приведения подобных в данном многочлене - Lisp

Узнай цену своей работы

Формулировка задачи:

Многочлен в «традиционной» инфиксной записи задан в виде списка из текстовых элементов (возведение в степень обозначается знаком ^). Написать функцию для приведения подобных в данном многочлене. Помогите, пожалуйста!

Решение задачи: «Написать функцию для приведения подобных в данном многочлене»

textual
Листинг программы
  1. ;; Ввод полинома
  2.  
  3. (defun input-poly (p &aux (x (explode p)) res i (f 0) (sign 1) (coef 0) (u 0))
  4.   (dolist (i x res)
  5.     (cond ((EQ i '+) (when (and (= u 0) (= f 1)) (setq u 1))
  6.                            (if (> f 0) (setq res (append res (list (list coef u))))
  7.                                        (setq res (append res (list (list u 0)))))  
  8.                            (setq sign 1 u 0 f 0 coef 0))
  9.           ((EQ i '-) (when (and (= u 0) (= f 1)) (setq u 1))
  10.                            (if (> f 0) (setq res (append res (list (list coef u))))
  11.                                        (setq res (append res (list (list u 0)))))  
  12.                            (setq sign -1 u 0 f 0 coef 0))
  13.           ((fixedp i) (setq u (+ i (* u 10))))
  14.           ((EQ i 'x)  (when (= u 0) (setq u 1))
  15.                       (setq f 1 coef (* sign u) u 0))
  16.           ((EQ i '^) (setq f 2))))
  17.   (cond ((= f 0) (setq res (append res (list (list (* sign u) 0)))))
  18.         (t       (setq res (append res (list (list coef u))))))
  19.   (qsort-b (remove '(0 0) res) #'(lambda (x y) (> (cadr x) (cadr y)))))
  20.  
  21. ;; Вывод полинома
  22.  
  23.  (defun output-poly (x &aux i c p res)
  24.    (dolist (i x (implode res))
  25.       (setq c (car i))
  26.       (setq p (cadr i))
  27.       (when (and (> c 0) (not (null res))) (setq res (append res (list '+))))
  28.       (when (< c 0) (setq res (append res (list '-))) (setq c (abs c)))
  29.       (when (and (= c 1) (null res)) (setq res (append res (list 1))))
  30.       (when (<> c 1) (setq res (append res (list c))))
  31.       (cond ((> p 1) (setq res (append res (list 'x '^ p))))
  32.             ((= p 1) (setq res (append res (list 'x)))))))
  33.  
  34. ;; Приведение подобных            
  35.            
  36. (defun reduce-poly (x &aux i c p cc cp res lstp)
  37.   (dolist (i x (qsort-b res #'(lambda (x y) (> (cadr x) (cadr y)))))
  38.       (setq cc 0)
  39.       (setq p (cadr i))
  40.       (dolist (j x t)
  41.          (setq cp (cadr j))
  42.          (when (= cp p) (setq cc (+ cc (car j)))))
  43.       (when (and (<> cc 0) (not (memb p lstp)))
  44.        (setq res (append res (list (list cc p))))
  45.        (setq lstp (cons p lstp)))))
  46.            
  47.            
  48. (output-poly (reduce-poly (input-poly '2+x^3-6x^2+12x^4+11x-7x^3)))
  49.  
  50. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы