#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. Итак, где я мог бы применить обратную функцию, чтобы заставить ее выдавать правильные выходные данные? Потому что это дает мне результат в обратном порядке