Esercizio di espressione lambda
Domanda
Ultimamente ho cercato di saperne di più sulle espressioni lambda e ho pensato a un esercizio interessante ...
c'è un modo per semplificare una funzione di integrazione c ++ come questa:
// 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;
}
usando le espressioni c # e lambda?
Soluzione
Che dire di questo:
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;
}
Prova:
Func<double, double> fun = x => Math.Pow(x,2);
double result = Integrate(0, 10, fun);
Altri suggerimenti
Lambda Powa! Non sono sicuro che sia giusto (nessun programmatore C #! Mi piace solo la sua roba 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, quindi penso che mentre il codice è C ++, perché non tenerlo C ++ e inserire lambda? Ecco come cerca c ++ 0x, che si spera venga presto rilasciato come 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; });
}
Il vero potere viene, come detto, quando lo si chiama. Ad esempio, in 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;
}
Quindi:
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...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow