-3
私はすでにを計算する関数を持っていると考えて、x = |f(x) - f(x-1)|
を計算する関数を書くでしょうか?x = | f(x)-f(x-1)|を計算するC#関数。
私はすでにを計算する関数を持っていると考えて、x = |f(x) - f(x-1)|
を計算する関数を書くでしょうか?x = | f(x)-f(x-1)|を計算するC#関数。
が一般的なケース(我々は|f(x) - f(x-1)|
を返しFunc<T, T>
ラムダに変身したいFunc<T, T> f
ラムダを持っている)で、それは非常に興味深い問題です(大への感謝、質問へのコメントを参照)。のが楽しみましょう:みましょう、今
using System.Linq.Expressions;
using System.Reflection;
...
public static partial class FuncExtensions {
public static Func<T, T> AbsDiff<T>(this Func<T, T> source) {
if (null == source)
throw new ArgumentNullException("source");
var x = Expression.Parameter(typeof(T), "x");
Expression<Func<T, T>> f = v => source(v);
MethodInfo abs = typeof(Math).GetMethod("Abs", new Type[] { typeof(T) });
var one = Expression.Convert(Expression.Constant(1), typeof(T));
var body = Expression.Call(abs, Expression.Subtract(
Expression.Invoke(f, x),
Expression.Invoke(f, Expression.Subtract(x, one))));
return Expression.Lambda(body, x).Compile() as Func<T, T>;
}
}
をテスト:
Func<double, double> f1 = x => x * x;
Func<int, int> f2 = x => x;
// |2*2 - 1*1| == 3
Console.WriteLine(f1.AbsDiff()(2).ToString());
// |5 - 4| == 1
Console.WriteLine(f2.AbsDiff()(5).ToString());
P.S. ( - F(X - 1)f(x)が) `私はそれが何が実際にが質問に望んでいた、Math.Abs
var result = Math.Abs(f(x) - f(x - 1));
' Math.Absようにそれを呼び出すための方法がが疑われますか? –
'f(x)'が解析的に微分可能でない限り、2つの異なる引数で明示的に呼び出す必要があり、絶対値を取る必要がありますか?あなたはここでどんな魔法を望んでいたのですか? –
fとは何か、fが1つの引数をとり、変数を返すメソッドであれば、これは簡単です! – hdrdiab