【问题标题】:What am I doing wrong for this SICP question in clojure?我在 clojure 中对这个 SICP 问题做错了什么?
【发布时间】:2021-06-13 23:53:36
【问题描述】:

我正在通过 Clojure 中的 SICP 工作。我坚持练习 1.38。

在 1.37 中,我创建了递归和迭代过程来计算有限连分数,然后在 1.38 中,我应该使用该代码来估计欧拉数,其中分数是:

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

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

为了计算 e,我想做:

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

其中d定义为:

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

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

;; first iterative try
(defn cont-frac-4 [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)))

;; second iterative try
(defn cont-frac-5 [n d k]
  (defn frac-iter [i result]
        (if (zero? i)
        result
    (frac-iter (dec i) (/ (n i) (+ (d i) result)))))
(frac-iter (dec k) (/ (n k) (d k))))

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

感谢您的建议!

【问题讨论】:

    标签: clojure sicp


    【解决方案1】:

    第一个迭代过程看起来不错,我认为导致问题的是您对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
    

    【讨论】:

    • 谢谢奥斯卡!!这很有帮助。看到这个之后,我回去尝试让我的迭代公式适用于原始 d,并看到我可以将 (d i) 更改为 (d (dec i))。我从来没有想过要改变 d 本身,现在我知道了!
    • 感谢您告诉我该怎么做,我是堆栈交换的新手,不知道。我刚刚检查了绿色检查!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2018-10-23
    相关资源
    最近更新 更多