Clojure quadrati c формула - PullRequest
       30

Clojure quadrati c формула

0 голосов
/ 11 марта 2020
(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)))
)

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

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Вам нужно либо (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]

Вы также можете wi sh использовать 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]))
0 голосов
/ 13 марта 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...