我试图弄清楚如何编写一个程序来用莱布尼茨公式逼近 pi。该函数接受一个误差 E,并以某种方式给出 pi 近似值。
我完全不确定该怎么做。我开始编写一个辅助函数,但不知道该放什么。有什么帮助吗?
谢谢!
除非使用某种收敛加速技术,否则莱布尼茨公式是计算 π 的一种相当低效的方法。根据维基百科,使用级数的直接求和计算 π 到 10 个正确的小数位需要大约 5,000,000,000 个术语!
无论如何,这是公式的直接翻译 - 进行了一些小的优化,包括删除了幂运算,这使得它比 @GoZoner 的实现略快:
(define (leibniz err)
(let loop ((n 0)
(prev +nan.0)
(curr 0.0))
(if (<= (abs (- curr prev)) err)
(* 4 curr)
(loop (add1 n)
curr
((if (even? n) + -) curr (/ 1 (add1 (+ n n))))))))
该过程不断迭代,直到系列的当前值与前一个值之间的差小于或等于提供的误差。错误应该是一个很小的数字,比如说1e-6
。例如:
(leibniz 1e-6)
=> 3.1415946535856922
PI的莱布尼茨公式是一个求和。该函数将递增 n,直到 n 的和小于 E。
(define (leibniz err)
(define (summand n)
(/ (expt -1 n) (+ (* 2.0 n) 1)))
(let summing ((result 0) (n 0))
(let ((increment (summand n)))
(if (< (abs increment) err)
(* 4 (+ result increment))
(summing (+ result increment) (+ n 1))))))