2

我正在尝试使用 Clojure 完成 SICP 中的一些练习,但我当前执行辛普森规则的方法出现错误(例如 1-29)。这与懒惰/急切的评估有关吗?有想法该怎么解决这个吗?错误和代码如下:

java.lang.ClassCastException:user$simpson$h__1445 不能在 clojure.lang.Numbers.divide (Numbers.java:139) 处转换​​为 java.lang.Number

这是代码:

(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)))
4

1 回答 1

7

您将其定义h为无参数的函数,然后尝试将其当作数字来使用。我也不确定你在做什么(sum simpson-term 0 inc n);我只是假设这sum是您从 SICP 获得的一些魔力,并且您传递给它的参数是正确的(我隐约记得它们定义了某种通用总和)。

另一件事是,将 adefdefn嵌套在 a中几乎总是一个糟糕的主意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))))
于 2011-05-24T00:30:20.307 回答