SICP练习1.37:我的迭代解决方案得到了正确答案,但在1.38中出错了

时间:2012-08-28 07:10:03

标签: lisp scheme racket sicp

我对SICP 1.37的迭代解决方案是

(define (con-frac n d k)
  (define (iter i result)
    (if (= 1 i)
        result
        (iter (- i 1) (/ (n i) (+ (d i) result)))))
  (iter k (/ (n k) (d k))))

(con-frac (lambda (i) 1.0) (lambda (i) 1.0) 11)

(define (euler-d i)
  (if (= 2 (remainder i 3))
      (* (/ 2 3) (+ i 1))
      1))

(define (e)
  (+ 2 (con-frac (lambda (i) 1.0) euler-d 9)))

(e)

它返回:

Welcome to DrRacket, version 5.2.1 [3m].
Language: SICP (PLaneT 1.17); memory limit: 128 MB.
0.6180555555555556
2.39221140472879

应该是返回:

Welcome to DrRacket, version 5.2.1 [3m].
Language: SICP (PLaneT 1.17); memory limit: 128 MB.
0.6180555555555556
2.718283582089552

我不知道我的解决方案有什么问题。

2 个答案:

答案 0 :(得分:6)

您在iter。{/ p>之前离开了

  (define (iter i result)
    (if (= 1 i)
        result
        (iter (- i 1) (/ (n i) (+ (d i) result)))))

(= 1 i)更改为(= 0 i

  (define (iter i result)
    (if (= 0 i)
        result
        (iter (- i 1) (/ (n i) (+ (d i) result)))))

使用phi的测试没有发现这一点,因为所有分子和分母都是相等的。

答案 1 :(得分:2)

正如@ soegaard的答案所指出的那样,代码中有一个简单的off-by-one error。只需替换此行:

(if (= 1 i)

有了这个 - 它比询问(= 0 i)

更具惯用性
(if (zero? i)

......就是这样!