方案莱布尼茨系列
Scheme leibniz series
我想弄清楚我的数学出了什么问题。
(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
问题出在您的耐受性测试上。您正在测试公差,然后乘以 4。反过来(return 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.141592603589817
我想弄清楚我的数学出了什么问题。
(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
问题出在您的耐受性测试上。您正在测试公差,然后乘以 4。反过来(return 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.141592603589817