簡體   English   中英

方案中的二次公式

[英]Quadratic formula in Scheme

方案

我想定義一個函數,該函數返回給定ax ^ 2 + bx + c = 0的二次方程式的根。 僅返回真實根。 該列表將具有0、1或兩個唯一的根。

(define (quadratic a b c)
    (cond
        ((> (- (* b b) (* 4 (* a c ) ) ) 0 ) (list ( / ( - (sqrt ( - (* b b) (* (* 4 a) c))) b ) ( * 2 a) )
            ( / ( - ( - (sqrt ( - (* b b) (* (* 4 a) c)))) b ) ( * 2 a) ) ) )
        ((= (- (* b b) (* 4 (* a c ) ) ) 0 ) list( / ( - (sqrt ( - (* b b) (* (* 4 a) c))) b ) ( * 2 a) ))
        (else ('( )'))
    )
)

我有

error: unexpected right parenthesis [read]
       #{&read-error}
       #{&i/o-port-error #{input-port #{input-channel "standard input" 0}}}

有沒有更好的方法來解決這個問題?

您有括號問題(很明顯,這就是錯誤所指出的)-例如,您忘記在代碼中第二個list的左側打開一個。 這應該解決它:

(define (quadratic a b c)
  (cond
    ((> (- (* b b) (* 4 (* a c))) 0)
     (list (/ (- (sqrt (- (* b b) (* (* 4 a) c))) b) (* 2 a))
           (/ (- (- (sqrt (- (* b b) (* (* 4 a) c)))) b) (* 2 a))))
    ((= (- (* b b) (* 4 (* a c))) 0)
     (list (/ (- (sqrt (- (* b b) (* (* 4 a) c))) b) (* 2 a))))
    (else '())))

另外,請注意縮進代碼的正確方法-它可以幫助您找到這樣的錯誤; 一個好的編輯器也會很有用。 讓我們測試一下過程:

(quadratic 1 -3 -4)
=> '(4 -1)
(quadratic 9 12 4)
=> '(-2/3)
(quadratic 3 4 2)
=> '()

先前的解決方案可以正確回答您的問題。 但是請注意,即使不需要(即使行列式為零),算法也會多次執行相同的計算,並且代碼很難讀取。 因此,我建議重寫您的函數,以更有效,更重要的是,以更易讀的方式產生相同的結果:

(define (quadratic a b c)
  (let ((determinant (- (* b b) (* 4 a c))))
    (if (negative? determinant)
        '()
        (let ((a2 (+ a a)))
          (if (zero? determinant)
              (list (/ (- b) a2))
              (let ((root (sqrt determinant)))
                (list (/ (- root b) a2)
                      (/ (- (- root) b) a2))))))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM