# {-Очень простая функция высшего порядка на C#

# Написать на C# функцию (статический метод) Integral, 
# которая позволяет вычислять определенный интеграл на данном интервале. 
# У нее должны быть быть 3 параметра:
# - f - функция (статический метод или лямбда выражение) 
# - a, b - пределы интегрирования.
# Пример вызова:

# double result = Integral(x => x*x, 0, 1);

# Метод интегрирования можно взять любым, самым простым. 
# Например, разбить отрезок на 100 равных частей и использовать 
# метод прямоугольников или метод трапеций.

# Замечания:
# - Пример похожей программы есть вот тут: http://msimuni.wikidot.com/fp-commonlang
# - Там же разные замечания про то, зачем эти задачки про "обычные" языки, 
# как их сдавать и т.д.
# - Если хотите, можете сделать задачу на С++ или на каком-нибудь другом "обычном" языке. 
# Если есть сомнения, подойдет ли тот или иной язык, пишите.-}

import math

def Integral (f, a, b):
    h = (b-a)/1000
    return (f(a) + f(b)) * h/2 + \
                sum ( map ((lambda x: f(x) * h), \
                [a + h* i for i in range(1, 1000)]))
                


print(Integral(lambda x: x*x, 0, 3))                    # ~ 9.0
print(Integral(lambda x: math.sin(x), 0, math.pi/2))    # ~ 1.0
