2

SICP1.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

で1つずつずれてい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の回答で指摘されているように、コードには単純な1つずつのエラーがあります。この行を置き換えるだけです:

(if (= 1 i)

これでは、次のことを尋ねるよりも少し慣用的です(= 0 i)

(if (zero? i)

...そしてそれだけです!

于 2012-08-28T14:21:30.763 に答える