2008-11-13 8 views
4

J'ai essayé d'en apprendre davantage sur les expressions lambda ces derniers temps, et la pensée d'un exercice intéressant ...Lambda expression exercice

est-il un moyen de simplifier une C++ fonction d'intégration comme ceci:

// 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; 
} 

en utilisant des expressions C# et lambda?

Répondre

6

Qu'en est-ce:

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; 
} 

Test:

Func<double, double> fun = x => Math.Pow(x,2);   
    double result = Integrate(0, 10, fun); 
+0

hehe - en quelques secondes l'un de l'autre ;-p –

0

La puissance réelle est, comme indiqué, lors de l'appel. Par exemple, en 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; 
    } 

Puis:

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... 
2

Lambda Powa! Je ne sais pas si cela est juste (pas programmeur C#! Juste aimer son truc lambda)

(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; 
} 

Ok, donc je pense alors que le code est C++, pourquoi ne pas le garder C++ et obtenir lambda? Voici comment il cherche C++ 0x, en espérant qu'il sera bientôt publié en tant que standard:

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; }); 
} 
Questions connexes