#lang whalesong
;; Srinivasa Ramanujan's infinite series for approximating pi.

(define (sum f a b)
  (cond
    [(= a b)
     (f a)]
    [else
     (+ (f a)
        (sum f (add1 a) b))]))

(define (fact x)
  (cond
    [(= x 0)
     1]
    [else
     (* x (fact (sub1 x)))]))


(define (1/pi-approx n)
  (* (/ (* 2 (sqrt 2))
        9801)
     (sum (lambda (k)
            (/ (* (fact (* 4 k))
                  (+ 1103 (* 26390 k)))
               (* (expt (fact k) 4)
                  (expt 396 (* 4 k)))))
          0
          n)))

(define (pi-approx n)
  (/ 1 (1/pi-approx n)))


(pi-approx 10)
