Возвращает члены многочлена в clojure

#clojure

#clojure

Вопрос:

Мне просто нужно написать функцию, которая вернет список членов в многочлене, поэтому, например: скажем, у нас есть 3x ^ 4 2x ^ 3 x ^ 2 x 10 , она вернет вывод в виде: [показатель переменной коэффициента]

Моя функция до сих пор:

 (defn terms-of-poly [poly]
    for [x (poly :coefficients)]
    for [y(poly :variables)]
    [x y])


  

Ввод:

 (let [poly {:variable "y"
            :coefficients [3 2 1 10]}]
    (vec (terms-of-poly poly)))
  

Вывод: [[3 «x» 4] [2 «x» 3] [1 «x» 2] [10 «x» 0]]

Комментарии:

1. разве входные коэффициенты не должны быть [3 2 1 0 10] тогда? Поскольку там поли равен 3x^4 2x^3 x^2 0x^1 10

2. Вы вызываете функцию с :variable помощью, но пытаетесь прочитать :variables из нее. В вашем for s отсутствуют, по крайней мере, окружающие скобки.

3. @leetwinski: Поскольку в x многочлене есть член, я бы подумал, что коэффициенты должны быть [3 2 1 1 10] для 3x^4 2x^3 1x^2 1x^1 10x^0 ?

4. @BobJarvis-Восстановите Monica , op изменил вопрос (см. Редактирование). раньше ввод был 3x^4 2x^3 x^2 10 .. итак, мой комментарий был правильным для первоначального вопроса.

Ответ №1:

решение может выглядеть примерно так:

 (let [poly {:variable "y"
            :coefficients [3 2 1 0 10]}]
  (mapv vector
        (rseq (:coefficients poly))
        (repeat (:variable poly))
        (range)))

;;=> [[10 "y" 0] [0 "y" 1] [1 "y" 2] [2 "y" 3] [3 "y" 4]]
  

он инвертирован, но вы можете изменить его с помощью rseq / reverse

(обратите внимание, я изменил входные данные, поскольку есть еще один элемент, а именно 0x^1 )

более или менее то же самое с подходом к пониманию списка:

 (let [poly {:variable "y"
            :coefficients [3 2 1 0 10]}]
  (for [[pow coeff] (map-indexed vector (rseq (:coefficients poly)))]
    [coeff (:variable poly) pow]))

;;=> ([10 "y" 0] [0 "y" 1] [1 "y" 2] [2 "y" 3] [3 "y" 4])
  

вы также можете отфильтровать коэффициенты с нулевыми множителями:

 (let [poly {:variable "y"
            :coefficients [3 2 1 0 10]}]
  (for [[pow coeff] (map-indexed vector (rseq (:coefficients poly)))
        :when (pos? coeff)]
    [coeff (:variable poly) pow]))

;;=> ([10 "y" 0] [1 "y" 2] [2 "y" 3] [3 "y" 4])
  

Обновить

если порядок важен (хотя я предполагаю, что обратный порядок должен быть в порядке, поскольку каждый элемент идентифицируется по его мощности), вы можете сделать следующее, например:

 (defn terms-of-poly [{:keys [variable coefficients]}]
  (map vector
       coefficients
       (repeat variable)
       (range (dec (count coefficients)) -1 -1)))

(let [poly {:variable "y"
            :coefficients [3 2 1 0 10]}]
  (terms-of-poly poly))

;;=> ([3 "y" 4] [2 "y" 3] [1 "y" 2] [0 "y" 1] [10 "y" 0])
  

Комментарии:

1. Итак, где я мог бы применить обратную функцию, чтобы заставить ее выдавать правильные выходные данные? Потому что это дает мне результат в обратном порядке