Лямбда-выражение - PullRequest
       6

Лямбда-выражение

4 голосов
/ 13 ноября 2008

В последнее время я пытался узнать больше о лямбда-выражениях и подумал об одном интересном упражнении ...

есть способ упростить функцию интеграции с ++, например:

// Integral Function
double integrate(double a, double b, double (*f)(double))
{
    double sum = 0.0;

    // Evaluate integral{a,b} f(x) dx
    for(int n = 0 ; n <= 100; ++n)
    {
        double x = a + n*(b-a)/100.0;
        sum += (*f)(x) * (b-a)/101.0;
    }
    return sum;
}

с помощью выражений c # и lambda?

Ответы [ 3 ]

6 голосов
/ 14 ноября 2008

Что по этому поводу:

public double Integrate(double a,double b, Func<double, double> f)
{
    double sum = 0.0;

    for (int n = 0; n <= 100; ++n)
    {
        double x = a + n * (b - a) / 100.0;
        sum += f(x) * (b - a) / 101.0;
    }
    return sum;
}

Тест:

    Func<double, double> fun = x => Math.Pow(x,2);        
    double result = Integrate(0, 10, fun);
2 голосов
/ 14 ноября 2008

лямбда-пауа! Не уверен, что это правильно (нет программиста на C #! Просто нравится его лямбда-ноты)

(a, b, c) => {
    double sum = 0.0;
    Func<double, double> dox = (x) => a + x*(b-a)/100.0;

    // Evaluate integral{a,b} f(x) dx
    for(int n = 0 ; n <= 100; ++n)
        sum += c(dox(n)) * (b-a)/101.0;

    return sum;
}

Хорошо, я думаю, что пока код на C ++, почему бы не сохранить его на C ++ и не вводить лямбду? Вот как это выглядит для c ++ 0x, который, как мы надеемся, выйдет в качестве стандарта очень скоро:

static double Integrate(double a, double b, function<double(double)> f)
{
    double sum = 0.0;

    // Evaluate integral{a,b} f(x) dx
    for(int n = 0; n < 100; ++n) {
        double x = a + n * (b - a) / 100.0;
        sum += f(x) * (b - a) / 101.0;
    }
    return sum;
}  

int main() {
    Integrate(0, 1, [](double a) { return a * a; });
}
0 голосов
/ 14 ноября 2008

Настоящая сила приходит, как уже говорилось, когда ее зовут. Например, в C #

    static double Integrate(double a, double b, Func<double, double> func)
    {
        double sum = 0.0;

        // Evaluate integral{a,b} f(x) dx
        for(int n = 0 ; n <= 100; ++n)
        {
            double x = a + n*(b-a)/100.0;
            sum += func(x) * (b - a) / 101.0;
        }
        return sum;
    }

Тогда:

    double value = Integrate(1,2,x=>x*x); // yields 2.335
    // expect C+(x^3)/3, i.e. 8/3-1/3=7/3=2.33...
...