我在试着找出我的数学出了什么问题。
(define (make-pi tolerance)
(let loop ((n 0)
(prev +nan.0)
(curr 0.0))
(if (< (abs (- curr prev)) tolerance)
(* 4.0 curr)
(loop (add1 n)
curr
((if (even? n) + -) curr (/ 1.0 (add1 (+ n n))))))))输出必须是:
(make-pi 0.1) => 3.09162380666784
(make-pi 0.001) => 3.1410926536210413
(make-pi 0.0000001) => 3.141592603589817但我一直在想:
(make-pi 0.1) => 2.9760461760461765
(make-pi 0.001) => 3.143588659585789
(make-pi 0.0000001) => 3.1415928535897395发布于 2021-01-16 02:05:56
问题出在你的耐力测试上。你在测试容差,然后乘以4。反过来做(返回prev而不是curr),你就会得到你想要的结果:
(define (make-pi tolerance)
(let loop ([n 0]
[prev +nan.0]
[curr 0.0])
(if (< (abs (- curr prev)) (/ tolerance 4))
(* 4 prev)
(loop (add1 n)
curr
((if (even? n) + -) curr (/ 1 (+ 1 n n)))))))
> (make-pi 0.1)
3.09162380666784
> (make-pi 0.001)
3.1410926536210413
> (make-pi 0.0000001)
3.141592603589817https://stackoverflow.com/questions/65740928
复制相似问题