Квадратичная формула Clojure

(ns quadratic_roots) ;name the program 


(defn quadraticRoots[a b c]
    (/ (+ (- 0 b) (Math/sqrt (- (Math/expt b 2) (* 4 a c)))) (* 2 a)) (/ (- (- 0 b) (Math/sqrt (- (Math/expt b 2) (* 4 a c)))) (* 2 a)))
)

Это только первая часть программы с квадратичными формулами, которую я пишу. У меня возникли проблемы с попыткой выяснить, как заставить работать метод экспоненты. Кроме того, у меня возникли проблемы с попыткой создать основную программу-драйвер для реализации функции quadraticRoots.


person hkira1    schedule 11.03.2020    source источник


Ответы (2)


Вам нужно либо (Math/pow b 2), либо просто (* b b), чтобы получить b^2:

(defn quadraticRoots [a b c]
  ; for simple squares, often simplify (Math/pow b 2) => (* b b)
  (let [discriminant (Math/sqrt (- (Math/pow b 2)
                                 (* 4 a c)))
        root-1       (/ (+ (- b) discriminant)
                       (* 2 a))
        root-2       (/ (- (- b) discriminant)
                       (* 2 a))]
    [root-1 root-2]))

с результатом (см. пример проблемы):

  ; Example:  x^2 + 4x - 21 = 0
  (let [a 1
        b 4
        c -21]

а потом

(quadraticRoots a b c) => [3.0 -7.0]

Вы также можете использовать git clone в этом шаблонном проекте, чтобы у вас была рабочая настройка для получить вы идете.


Обновить

Математические формулы (даже простые) часто не так распознаваемы в компьютерном коде. Альтернативная формулировка вышеизложенного может выглядеть так:

(defn quadratic-roots 
  "Solve for the 2 roots of a quadratic equation of the form:

       ax^2 + bx + c = 0 
  "
  [a b c]
  (let [discriminant (Math/sqrt (- (* b b) (* 4 a c)))
        neg-b        (- b)
        inv-a2       (/ 1 (* 2 a))
        root-1       (* inv-a2 (+ neg-b discriminant))
        root-2       (* inv-a2 (- neg-b discriminant))]
    [root-1 root-2]))
person Alan Thompson    schedule 11.03.2020
comment
Для удобочитаемости я бы предложил также извлечь функцию для второй половины функции: (let [determinant ..., solve (fn [d] (/ (- d b) 2 a))] (map solve [b (- b)])) - person amalloy; 12.03.2020
comment
Придирка: выражение под квадратным корнем обычно называют дискриминантом. детерминант — это нечто другое. - person Thumbnail; 12.03.2020

Вы также можете попробовать макрос, например infix.

(use 'infix.macros)

(let [a 1
      b 4
      c -21]
  (infix (- b + √(b ** 2 - 4 * a * c)) / (2 * a)))
;; => 3.0

макрос преобразует ваше инфиксное выражение в s-exp ниже:

(/ (+ (- b) (Math/sqrt (- (Math/pow b 2) (* (* 4 a) c)))) (* 2 a))

и оцените его в следующем порядке:

| | -=> -4
| | | b=> 4
| | | a=> 1
| | | *=> 4
| | | c=> -21
| | | *=> -84
| | | -=> 100.0
| | +=> 6.0
| | a=> 1
| | *=> 2
(infix (- b + √ ...) / (2 * a))=> 3.0

person rmcv    schedule 13.03.2020