2

我对 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

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

4

2 回答 2

6

你在iter.

  (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没有捕捉到这一点。

于 2012-08-28T07:47:45.770 回答
2

正如@soegaard 的回答中所指出的那样,您的代码中有一个简单的错误。只需替换这一行:

(if (= 1 i)

有了这个 - 它比询问是否更惯用(= 0 i)

(if (zero? i)

... 就这样!

于 2012-08-28T14:21:30.763 回答