微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于 clojure 中的这个 SICP 问题,我做错了什么?

如何解决对于 clojure 中的这个 SICP 问题,我做错了什么?

我正在 Clojure 中处理 SICP。我被困在练习 1.38。

在 1.37 中,我使用递归和迭代程序来计算有限连分数,然后在 1.38 中,我应该使用该代码来估计分数所在的欧拉数:

N1/(D1+N2/(D2+N3/(D3...+Nk/Dk)))

其中 e-2 等于这个分数,其中 N 始终为 1,D 为 1,2,1,4,6,8,...

为了计算 e,我想做:

col1

其中 d 定义为:

(+ 2 (cont-frac-4 (constantly 1.0) d 10))

这适用于我的递归过程:

(defn d [i] (if (zero? (rem (+ 2 i) 3)) (* 2 (/ (+ 2 i) 3)) 1))

但不是我的迭代过程:(我尝试了两种方法并得到相同的错误结果)

(defn cont-frac-3 [n d k]
  (defn cont-frac-rec [i]
        (if (= i k)
        0
    (/ (n i) (+ (d i) (cont-frac-rec (inc i))))))
(cont-frac-rec 0))

我用它作为参考,但它不是用 Clojure 编写的,所以我不确定我错过了什么:https://billthelizard.blogspot.com/2010/07/sicp-137-138-and-139-continued.html

感谢您的建议!

解决方法

第一个迭代过程看起来不错,我认为导致问题的原因是您对 d 的定义,需要重写以适应迭代过程。这对我有用,并给出与递归过程相同的结果:

(defn cont-frac [n d k]
  (letfn [(cont-frac-iter [i acc]
            (if (zero? i)
              acc
              (cont-frac-iter (dec i) (/ (n i) (+ (d i) acc)))))]
    (cont-frac-iter k 0)))

(defn d [i]
  (if (= (mod i 3) 2)
    (* 2 (Math/ceil (/ i 3)))
    1))

结果如预期:

(+ 2 (cont-frac (constantly 1.0) d 10))
=> 2.7182817182817183

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。