1

以下は、無名再帰の関数とテストです。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);
    }
4

1 に答える 1