Произведение полиномов в LISP

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

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

Всем привет, у меня проблема пишу задачу по умножению полиномов с учетом подбора подобных. Однако на последней стадии вышла проблема. У меня что-то не так работает. Отдельно создал функцию test и продвинулся чуть дальше, но недалеко.Вот как выглядят списки, используемые в test: DegTemp = [0 1 1 2], TempL3 = [16 12 32 24], DegL3 = [0 1 2]. В теории, то, что находится в функции test должно сравнивать степени полиномов (Все списки с приставкой Deg), однако вместо желаемого вывода: 16 44 24. Мне выводит 16 54 0. Голову ломаю второй день, буду благодарен за помощь.

Решение задачи: «Произведение полиномов в LISP»

textual
Листинг программы
(defun poly-prod (p1 p2)
  (let ((n1 (- (length p1) 1))
        (n2 (- (length p2) 1))
        (s 0)
        (k 0)
        (res nil))
   (dotimes (i (+ n1 n2 1) (reverse res))
      (setq s 0)
      (dotimes (j (+ i 1) t)
        (setq k (- i j))
        (setq s (+ s (if (and (<= j n1) (<= k n2)) (* (nth j p1) (nth k p2)) 0))))
        (push s res)))) 
 
(poly-prod '(1 1) '(1 1)) ;; (1+x)*(1+x)
 
==> (1 2 1) ;; 1+2x+x^2
 
(poly-prod '(1 1) '(1 -1)) ;; (1+x)*(1-x)
 
==> (1 0 -1) ;; 1-x^2
 
(poly-prod '(1 1) '(1 2 1)) ;; (1+x)*(1+2x+x^2)
 
==> (1 3 3 1) ;; (1+3x+3*x^2+x^3)
 
(poly-prod '(1 1) '(1 3 3 1)) ;; (1+x)*(1+3x+3x^2+x^3)
 
==> (1 4 6 4 1) ;; 1+4x+6x^2+4x^3+x^4

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

В представленном коде реализована функция poly-prod, которая принимает два полинома в качестве аргументов и возвращает их произведение. Полином представлен в виде списка, где каждый элемент - это коэффициент при соответствующей степени переменной x. Например, полином (1 1) представляет собой x + 1. Список переменных и значений, описанных в коде:

  1. p1 и p2 - переменные, которые содержат полиномы, передаваемые в функцию poly-prod.
  2. n1 и n2 - переменные, которые содержат длину полинома (количество элементов в списке) и вычисляются с помощью функции length.
  3. s - переменная, которая используется для хранения промежуточных результатов.
  4. k - переменная, которая используется для индексации элементов полинома.
  5. res - переменная, которая используется для хранения результата произведения полиномов.
  6. i и j - переменные, которые используются для индексации элементов полинома в цикле.
  7. t - переменная, которая используется в цикле dotimes и передает значение true, обеспечивая бесконечное выполнение цикла.
  8. x - переменная, которая используется для представления переменной в формулах. Код выполняет следующие действия:
  9. Создает функцию poly-prod, которая принимает два полинома в качестве аргументов.
  10. Инициализирует переменные n1, n2, s, k и res с начальными значениями.
  11. Использует цикл dotimes, чтобы произвести умножение элементов полиномов, начиная с нулевого элемента и до тех пор, пока индекс не станет больше n1 или n2.
  12. Внутри цикла dotimes используется еще один цикл dotimes, чтобы вычислить индексы элементов полинома, которые будут умножены.
  13. Если индексы находятся в пределах допустимого диапазона, то выполняется умножение соответствующих элементов и результат добавляется в переменную res.
  14. Результат произведения полиномов возвращается из функции poly-prod. Например, при вызове функции poly-prod '(1 1) '(1 2 1) происходит умножение полиномов x + 1 и x + 2x + x^2, что дает 1 + 2x + x^2.

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


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

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

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