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

Lisp SICP练习1.37:我的迭代解得到了正确答案,但在1.38中出现了错误,lisp,scheme,racket,sicp,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)

我对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)
它返回:

应返回:


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

你在
国际热核实验堆中一个接一个地离开了

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

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

由于所有的分子和分母都是相等的,所以使用phi的测试无法捕捉到这一点。

正如@soegaard的答案所指出的,代码中有一个简单的问题。只需替换这一行:

(if (= 1 i)
对于这个问题,它比询问
(=0i)
更为惯用:


…仅此而已!

考虑在euler-d函数中使用float
(if()(/2.0 3.0)…1.0)
一些“/的实现可能返回截断整数。
  (define (iter i result)
    (if (= 1 i)
        result
        (iter (- i 1) (/ (n i) (+ (d i) result)))))
  (define (iter i result)
    (if (= 0 i)
        result
        (iter (- i 1) (/ (n i) (+ (d i) result)))))
(if (= 1 i)
(if (zero? i)