Функция для возврата формата полиномиальной строки в clojure

#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