# Primer funkcije višjega reda: numerična integracija

def integral(f, a, b, n=100):
    """Integriraj f na intervalu od a do b s trapezno formulo,
       kjer interval razdelimo na n delov."""
    s = 0.0 # delna vsota
    x1 = a # trenutna delilna točka
    y1 = f(x1) # trenutna funkcijska vrednost
    # Pazi na off-by-one napako v zanki!
    # (Obi-wan error)
    for k in range(1, n+1):
        x2 = ((n - k) * a + k * b) / n # naslednja delilna točka
        y2 = f(x2) # naslednja funkcijska vrednost
        s += (b - a) * (y1 + y2) / (2 * n) # prištejemo ploščino trapeza
        (x1, y1) = (x2, y2) # premaknemo se naprej
    return s

# Z rekurzijo namesto z zanko
def integral2(f, a, b, n=100):
    """Integriraj f na intervalu od a do b s trapezno formulo,
       kjer interval razdelimo na n delov."""
 
    def vsota(s, x1, y1, k):
        if k > n:
            return s
        else:
            x2 = ((n - k) * a + k * b) / n # naslednja delilna točka
            y2 = f(x2) # naslednja funkcijska vrednost
            return vsota(s + (b - a) * (y1 + y2) / (2 * n), x2, y2, k+1)

    return vsota(0.0, a, f(a), 1)
