

def heron(a,tolerance):
    '''Uses the Heron method to approximate the square root'''
    oldGuess = 1.0
    newGuess = (a / oldGuess + oldGuess) / 2
    while abs(oldGuess - newGuess) > tolerance:
        oldGuess = newGuess
        newGuess = (a / oldGuess + oldGuess) / 2
    return newGuess

# We can break the function up into smaller functions if we want


def next_Guess(a, oldGuess):
    '''part of the Heron method for finding square roots'''
    return (a / oldGuess + oldGuess) / 2

def has_next_guess(a, tolerance, oldGuess):
    '''predicate function for Heron method for finding square roots'''
    newGuess = next_Guess(a, oldGuess)
    return (abs(oldGuess -newGuess) > tolerance)


def root_approx(a, tolerance):
    '''Uses the Heron method to approximate the square root'''
    guess = 1.0
    while has_next_guess(a, tolerance, guess):
        guess = next_Guess(a, guess)
    return next_Guess(a,guess)




