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

Lambda表达式是一个匿名的方法,在开发期我们是不知道其方法名是什么的,所以我们要怎么递归调用呢?

如果你看过我这文章让您知道您的方法是被何“人”调用 》的话,你应该会“啊哈”的拍一下头脑,思路就出来了,没错!!就是直接用StackFrame获取当前执行的方法,然后直接Invoke即可。

示例代码:

    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(
01, 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)
Tag标签: Linq
posted @ 2008-04-20 11:04 Kingthy 阅读(1880) 评论(12)  编辑 收藏 网摘 所属分类: C#

  回复  引用    
#1楼2008-04-20 11:40 | asp.net CMS[未注册用户]
还能这样,学习了
  回复  引用    
#2楼2008-04-20 12:14 | linq[未注册用户]
学习

  回复  引用  查看    
#3楼2008-04-20 12:31 | yushih      
或者用Y combinator
  回复  引用  查看    
#4楼2008-04-20 13:31 | Windie Chai      
太牛了!
  回复  引用  查看    
#5楼2008-04-20 15:41 | 生鱼片      
学习
  回复  引用  查看    
#6楼2008-04-20 17:35 | 深蓝      
长见识了。
  回复  引用  查看    
#7楼2008-04-20 21:33 | fox23      
这在函数式语言中是很常见的,但是C#中这样写不好调试把?
  回复  引用  查看    
#8楼2008-04-21 08:50 | 李战      
http://www.cnblogs.com/Emoticons/yoyocici/cool.gif" alt="" />不懂,等俺慢慢体会哈
  回复  引用  查看    
#9楼2008-04-21 17:06 | 怪怪      
相比楼主的方法,还是脑袋的不动点比较打动人...
  回复  引用  查看    
#10楼2008-04-21 19:42 | 镜涛      
嗯,没想到这样做。呵呵,看来不实践体会就是不深阿
  回复  引用  查看    
#11楼2008-04-22 11:08 | 装配脑袋      
在lambda表达式中进行递归的标准做法是使用Y算子(不动点算子)
你可以看看它的纯匿名定义方法研究(但实用中你可以进行简化的定义)
http://www.cnblogs.com/Ninputer/archive/2007/11/23/970460.html" target="_new">http://www.cnblogs.com/Ninputer/archive/2007/11/23/970460.html

  回复  引用  查看    
#12楼[楼主]2008-04-22 15:36 | Kingthy      
@装配脑袋
刚详细的看了,看了两次才看懂,哈,真是叹为观止啊,Lambda太多东东搞了,看来要加强自己的逻辑思维能力才行,要不然看得头晕晕的。。




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1162248




相关文章:

相关链接: