2014-03-14 28 views
1

我想做一個函數,其中rootcheck有一個列表L作爲輸入,L總是3個原子(abc)其中a是x^2的係數,b和c的係數是c不變。它使用判別式(b^2 - 4ac)檢查方程是否是二次的,並且應該輸出這個(num'L),其中num是根的數量,L是包含根本身的列表(使用二次公式),L在沒有根的情況下是空的。這裏是我的代碼:方案二次函數/平方根檢查

(define roots-2 
    (lambda (L) 
    (let ((d (- (* (cdr L) (cdr L)) (4 (car L) (caddr L)))))) 
    (cond ((< d 0) (cons(0 null))) 
    ((= d 0) (cons(1 null))) 
    (else((> d 0) (cons(2 null))))) 
      )) 

它給我沒有體內錯誤的表達。

我也嘗試編碼二次函數,甚至嘗試了一些聯機,一個編譯的fint,但當我插入輸入時給了我一個錯誤,這是二次函數的代碼,而不是礦山!

(define quadratic-solutions 
(lambda (a b c) (list (root1 a b c) (root2 a b c)))) 
(define root1 
(lambda (a b c) (/ (+ (- b) (sqrt (discriminant a b c))) 
(* 2 a)))) 
(define root2 
(lambda (a b c) (/ (- (- b) (sqrt (discriminant a b c))) 
(*2 a)))) 
(define discriminant 
(lambda (a b c) (- (square b) (* 4 (* a c))))) 
+0

爲什麼CL標籤。你還在尋找Common Lisp的答案嗎? – Sylwester

+0

縮進的代碼不可讀。 – GoZoner

回答

3

有代碼的幾個錯誤:

  • 一些括號內放置不正確,使用一個很好的IDE來檢測這樣的問題。這是導致錯誤的報道,let沒有身體
  • 你忘了在4ac部分乘以
  • 你正確訪問的第二個元素列表
  • else部分不能有條件
  • 輸出列表不正確構建

這應該修正錯誤,現在來計算第二和第三種情況的根源函數實際調用替換null(< d 0)情況是好的,因爲它是):

(define roots-2 
    (lambda (L) 
    (let ((d (- (* (cadr L) (cadr L)) (* 4 (car L) (caddr L))))) 
     (cond ((< d 0) (list 0 null)) 
      ((= d 0) (list 1 null)) 
      (else  (list 2 null)))))) 
+0

謝謝!即時通訊使用DrRacket,有何建議? – user3241846

+2

使用帶有頻率的「Reindent All」選項,它位於球拍菜單中。並且每隔一段時間執行一次「檢查語法」,它將幫助您儘早發現錯誤。寫一小段代碼並不斷測試它們。讓IDE引導您,以標準方式縮進並關閉括號 - 以上所有內容都將幫助您! –

0

爲二次型功能的一部分,我發現了一個網上的代碼和調整它提供的一元二次方程的根都。返回兩個根的列表

(define (solve-quadratic-equation a b c) 
    (define disc (sqrt (- (* b b) 
        (* 4.0 a c)))) 

(list  (/ (+ (- b) disc) (* 2.0 a)) 
      (/ (- (- b) disc) (* 2.0 a)) 
))