在Lambda表达式中进行递归调用

示例代码: 


    class Test 
    { 
        /**//// <summary> 
        ///  
        /// </summary> 
        /// <param name="v1"></param> 
        /// <param name="v2"></param> 
        /// <param name="num"></param> 
        /// <param name="total"></param> 
        /// <returns></returns> 
        public delegate long AddMethod(long v1, long v2, int num, int cout); 

        /**//// <summary> 
        ///  
        /// </summary> 
        /// <param name="addMethod"></param> 
        /// <param name="cout"></param> 
        static void Print(AddMethod method, int cout) 
        { 
            Console.WriteLine(method(0, 1, 2, cout)); 
        } 

        static void Main() 
        { 
            //求0,1,1,2,3,5,8.类似的数据队列在第30个位置的数 
            Print((v1, v2, num, cout) => 
                { 
                    Console.Write(v1); 
                    Console.Write(","); 

                    num++; 
                    if (num == cout) 
                    { 
                        Console.Write(v2);    
                        Console.WriteLine(); 
                        return v1 + v2;

   } 
                    else 
                    {                         
                        //取得当前方法 
                        StackFrame frame = new StackFrame(0); 
                        //递归调用 
                        return (long)(frame.GetMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout })); 
                    } 
                }, 30); 
            Console.Read(); 
        } 
    } 
我们的代码成功运行了,成功的求出在第30个位置的数值是:514229 

其时,.NET里还有一个东东可以方便的得到当前调用方法的引用,这东东就是MethodBase,其有一个静态方法GetCurrentMethod 可直接获取当前执行的方法引用,所以我们可以将上面的StackFrame处的两句代码改为如下: 
                        //递归调用 
                        return (long)(MethodBase.GetCurrentMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout })); 
执行后的结果都是一样的(不一样才怪了Orz)

posted on 2012-11-07 23:50  大花花  阅读(249)  评论(0编辑  收藏  举报

导航