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