Lambda 表达式练习
Posted
技术标签:
【中文标题】Lambda 表达式练习【英文标题】:Lambda expression exercise 【发布时间】:2008-11-13 20:30:45 【问题描述】:我最近一直在努力学习更多关于 lambda 表达式的知识,并想到了一个有趣的练习......
有没有办法像这样简化 c++ 集成函数:
// Integral Function
double integrate(double a, double b, double (*f)(double))
double sum = 0.0;
// Evaluate integrala,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 表达式?
【问题讨论】:
【参考方案1】:这个呢:
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);
【讨论】:
嘿嘿 - 几秒钟之内;-p【参考方案2】:拉姆达波瓦!不确定这是否正确(没有 C# 程序员!只是喜欢它的 lambda 东西)
(a, b, c) =>
double sum = 0.0;
Func<double, double> dox = (x) => a + x*(b-a)/100.0;
// Evaluate integrala,b f(x) dx
for(int n = 0 ; n <= 100; ++n)
sum += c(dox(n)) * (b-a)/101.0;
return sum;
好的,所以我认为虽然代码是 C++,但为什么不保留 C++ 并获取 lambda?以下是 c++0x 的外观,希望很快作为标准发布:
static double Integrate(double a, double b, function<double(double)> f)
double sum = 0.0;
// Evaluate integrala,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; );
【讨论】:
【参考方案3】:如前所述,真正的力量来自于调用它。例如,在 C# 中
static double Integrate(double a, double b, Func<double, double> func)
double sum = 0.0;
// Evaluate integrala,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...
【讨论】:
以上是关于Lambda 表达式练习的主要内容,如果未能解决你的问题,请参考以下文章