2011-05-24 60 views
2

我正在嘗試使用Clojure在SICP中進行一些練習,但是我正在執行辛普森規則(例如1-29)的錯誤。這是否與懶惰/渴望的評價有關?有想法該怎麼解決這個嗎?錯誤以及代碼都低於:爲什麼當我嘗試在Clojure中使用辛普森規則時會出現轉換錯誤?

java.lang.ClassCastException:用戶$辛普森$ h__1445不能clojure.lang.Numbers.divide被轉換爲java.lang.Number中 (Numbers.java:139)

下面是代碼:

(defn simpson [f a b n] 
    (defn h [] (/ (- b a) n)) 
    (defn simpson-term [k] 
    (defn y [] (f (+ a (* k h)))) 
    (cond 
     (= k 0) y 
     (= k n) y 
     (even? k) (* 2 y) 
     :else (* 4 y))) 
    (* (/ h 3) 
    (sum simpson-term 0 inc n))) 

回答

7

您定義h作爲參數的函數,然後再嘗試使用它,就好像它是一個數字。我也不確定你在(sum simpson-term 0 inc n);我只是假設sum是你從SICP獲得的一些魔法,並且你傳遞給它的論點是正確的(我隱約記得它們定義了某種通用的總和)。

另一件事情是,將defdefn嵌套在defn內幾乎總是一個可怕的想法。您可能需要let(用於臨時或本地)或另一頂級defn

銘記我沒有寫了多年simpson功能,並在所有沒有檢查這一個算法的正確性,這裏有一個小品是接近「正確的形狀」比你:

(defn simpson [f a b n] 
    (let [h (/ (- b a) n) 
     simpson-term (fn [k] 
         (let [y (f (+ a (* k h)))] 
         (cond 
          (= k 0) y 
          (= k n) y 
          (even? k) (* 2 y) 
          :else (* 4 y))))] 
    (* (/ h 3) 
     (sum simpson-term 0 inc n)))) 
相關問題