def pi_series_iter(n) :
    result = 0
    for i in range(1, n+1) :
        result = result + 1/(i**2)
    return result

def pi_approx_iter(n) :
    x = pi_series_iter(n)
    return (6*x)**(.5)

def pi_series_r(i) :
    assert(i >= 0)
    # base case
    if i == 0:
        return 0
    # recursive case
    else:
        return pi_series_r(i-1) + 1 / i**2

def pi_approx_r(n) :
    x = pi_series_r(n)
    return (6*x)**(.5)

def test_pi_approx() :
    assert(pi_approx_iter(10) == 3.04936163598207)
    assert(pi_approx_iter(100) == 3.1320765318091053)
    assert(pi_approx_iter(1000) == 3.1406380562059946)
    assert(pi_approx_iter(10000) == 3.1414971639472147)
    # Python's default stack depth limit is 1000, so we can't compute pi_approx_r(1000)
    for i in range(996) :
        assert(pi_approx_r(i) == pi_approx_iter(i))
    print("Done testing pi approximations")
