gpt4 book ai didi

clojure - 为什么在 Clojure 中尝试使用辛普森规则时会出现强制转换错误?

转载 作者:行者123 更新时间:2023-12-02 16:56:44 25 4
gpt4 key购买 nike

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

java.lang.ClassCastException: user$simpson$h__1445 无法转换为 java.lang.Number 在 clojure.lang.Numbers.divide (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)))

最佳答案

您将 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))))

关于clojure - 为什么在 Clojure 中尝试使用辛普森规则时会出现强制转换错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6104450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com