我对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
我不知道我的解决方案有什么问题。
答案 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)
......就是这样!