递归

//递归 
public class LinC
    {
        public static string Go()
        {
            Func<Func<int, int>, Func<int, int>> fun = child => x => x == 0 ? 1 : x * child(x - 1);
            var F = Recursion<int>.GetRecursion(fun);
            string aa = F(5).ToString();
            return aa;
        }

        public static void test()
        {
            List<FileInfo> res = new List<FileInfo>();
            DirectoryInfo dir = new DirectoryInfo(@"E:\AAA");
            //传入参数起作用,返回参数无实际意义,只为补完整函数体
            Func<Func<DirectoryInfo, DirectoryInfo>, Func<DirectoryInfo, DirectoryInfo>> fun = child => x =>
                {
                    res.AddRange(x.GetFiles());
                    foreach (var read in x.GetDirectories())
                        child(read);
                    //起终止递归的作用
                    return dir;
                };


            var F = Recursion<DirectoryInfo>.GetRecursion(fun);
            var ddd = F(dir);
        }
    }


    public class Recursion<K>
    {
        //自身代理
        delegate T LinDelegate<T>(LinDelegate<T> delageteSelf);

        public static Func<Func<Func<K, K>, Func<K, K>>, Func<K, K>> GetRecursionBase()
        {
            LinDelegate<Func<Func<Func<K, K>, Func<K, K>>, Func<K, K>>> self = y => f => x => f(y(y)(f))(x);
            Func<   Func<    Func<K, K>, Func<K, K>   >,        Func<K, K>   > res = self(self);
            return res;
        }

        public static Func<K, K> GetRecursion(Func<Func<K, K>, Func<K, K>> fun)
        {
            var F = Recursion<K>.GetRecursionBase();
            Func<K, K> res = F(fun);
            return res;
        }
    }

 

posted @ 2013-03-19 13:33  码写人生  阅读(186)  评论(0)    收藏  举报