2008-11-13 55 views
4

我一直在試圖更多地瞭解lambda表達式最近,和有趣的練習的想法...Lambda表達式鍛鍊

是有辦法簡化C++集成功能是這樣的:

// 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表達式來使用

回答

6

這個怎麼樣:

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); 
+0

hehe - 彼此之間的秒數;-p – 2008-11-13 21:10:32

0

真正的力量來自,如前所述,調用它時。例如,在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... 
2

LAMBDA POWA!不知道這是否是正確的(沒有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; }); 
}