方案莱布尼茨系列

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