以下は、無名再帰の関数とテストです。1 つ目は真の Y コンビネータで、見栄えはよくシンプルですが、かなり遅いです。100万回の反復を実行するには、1000ミリ秒かかります。2 番目は c(c,item) のせいでかなり醜いですが、最初の 2 倍の速さで動作します。
コードをよりシンプルに、より柔軟に、より安定させる必要があります (再帰呼び出しが必要な場合は、一連の関数などを作成する必要はありません)。
匿名の再帰を整理するより良い方法はありますか?
delegate Action<T> Continuation<T>(Continuation<T> r);
[TestMethod]
public void TestMethod()
{
IObject root = BuildComposite();
Performance.Measure(1000000, () =>
{
Apply(root, h => t =>
{
foreach (IObject item in t.Children)
{
//Console.WriteLine(item.Name);
h(item);
}
});
}, "Time ");
}
private static void Apply(IObject root, Func<Action<IObject>, Action<IObject>> g)
{
Continuation<IObject> action = c => thing => { g(c(c))(thing); };
Action<IObject> target = action(action);
target(root);
}
delegate void Continuation<T>(Continuation<T> r, T n);
[TestMethod]
public void TestMethod()
{
var root = BuildComposite();
Performance.Measure(1000000, () =>
{
Apply(root, (c, thing) =>
{
foreach (var item in thing.Children)
{
//Console.WriteLine(item.Name);
c(c, item);
}
});
},"Time");
}
void Apply(IObject root, Continuation<IObject> f)
{
f(f, root);
}