#clojure
#clojure
Вопрос:
Я работаю над полиномиальной программой, в которой я должен возвращать строковое представление полинома в качестве выходных данных в clojure… однако у меня возникают трудности с реализацией функции. Итак, ниже приведены спецификации:
Пример ввода 1: (формат-poly [3 «x» 4])
Вывод: «3x ^ 4»
Пример ввода 2: (формат-poly [2 «x» 0])
Вывод: «2»
Пример ввода 3: (формат-poly[1 «x» 4])
Вывод: «x ^ 4»
Пример ввода 4: (формат-poly[0 «x» 3])
Вывод: ноль
Моя реализация функции до сих пор:
(defn format-poly[polyterm]
(clojure.string/join (str (first polyterm) (second polyterm) "^" ) (str(nth polyterm 3)))
)
Комментарии:
1.
str/join
принимает один аргумент, чтобы просто объединить строки или два для объединения с чем-то другим, кроме пробела; в любом случае последние аргументы должны быть набором объектов для объединения. Как вы ожидаете, что все ваши особые случаи будут рассмотрены без использования каких-либо условий?
Ответ №1:
Следующее примет вектор, содержащий множитель, имя переменной и мощность, и вернет форматированную строку:
(defn format_poly [[mult var pow]]
(format "%d%s^%d" mult var pow))
Например,
(format_poly [3 "x" 4])
возвращает строку, содержащую
3x^4
Редактировать
(defn format-poly [[mult var pow]]
(case pow
0 (case mult
0 nil
(format "%d" mult))
1 (case mult
0 nil
1 var
(format "%d%s" mult var))
(case mult
0 nil
1 (format "%s^%d" var pow)
(format "%d%s^%d" mult var pow))))
который выдает
user=> (format-poly [3 "x" 4])
"3x^4"
user=> (format-poly [2 "x" 0])
"2"
user=> (format-poly[1 "x" 4])
"x^4"
user=> (format-poly[0 "x" 3])
nil
Ответ №2:
Это некрасиво, но работает:
(defn format_poly [[mult vari pow]]
(let [m (if (and (= 1 mult) (not= pow 0)) nil mult)
p (if (or (= 0 pow) (= 1 pow)) nil pow)
v (if (zero? pow) nil vari)
c (if (or (= pow 1) (nil? v)) nil "^")]
(if m
(if (zero? m) 0 (str m v c p))
(str m v c p))))
(format_poly [3 "x" 4]) ; 3x^4
(format_poly [2 "x" 0]) ; 2
(format_poly [1 "x" 4]) ; x^4
(format_poly [0 "x" 3]) ; 0
(format_poly [2 "x" 1]) ; 2x
(format_poly [0 "x" 0]) ; 0
(format_poly [1 "x" 0]) ; 1
(format_poly [1 "x" 1]) ; x