在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)
本文转自Kingthy博客园博客,原文链接:http://www.cnblogs.com/kingthy/archive/2008/04/20/1162248.html ,如需转载请自行联系原作者
相关文章
|
Java Nacos
SpringBoot 整合 Nacos
上一篇笔者已经介绍怎么安装 Nacos 了,这篇就开始重头戏。 搭建SpringBoot项目。
2685 1
|
Cloud Native Go
你知道 GO 中的 协程可以无止境的开吗?
你知道 GO 中的 协程可以无止境的开吗?
173 0
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
1434 3
|
10月前
|
人工智能 Kubernetes API
应用网关的演进历程和分类
唯一不变的是变化,在现代复杂的商业环境中,企业的业务形态与规模往往处于不断变化和扩大之中。这种动态发展对企业的信息系统提出了更高的要求,特别是在软件架构方面。为了应对不断变化的市场需求和业务扩展,软件架构必须进行相应的演进和优化。网关作为互联网流量的入口,其形态也在跟随软件架构持续演进迭代中。我们下面就聊一聊网关的演进历程以及在时下火热的 AI 浪潮下,网关又会迸发怎样新的形态。
707 147
|
Linux 编译器 数据处理
探索Linux中的`ld`命令:链接器的奥秘
`ld`是Linux中的链接器,将编译后的目标文件链接成可执行或共享库。作为GNU Binutils的一部分,它处理符号引用、重定位,支持多种文件格式和库类型。常用参数包括`-o`指定输出文件,`-l`链接库,`-L`指定搜索路径。编译器驱动程序常用于简化链接过程。理解符号解析、选择静态/动态链接及管理库版本是使用`ld`的关键。使用`--verbose`调试链接问题,并考虑优化选项。
|
9月前
|
视频直播
搭建体育直播系统,进行足球赛事的直播流程
在网络直播技术的推动下,使用“熊猫比分”源码搭建类似直播吧的体育赛事直播平台变得简单。首先获取源码,搭建系统;接着注册并申请主播认证;然后准备赛事直播,包括选择赛事、设置直播标题及获取推流地址;最后,利用OBS等工具开始直播。这一过程不仅方便快捷,还能为球迷提供高质量的观赛体验。
|
存储 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
408 7
|
存储 算法 数据处理
C++一分钟之-范围基础:views与ranges
【7月更文挑战第1天】C++20的Ranges库简化了集合操作,引入了Range(具有begin()和end()的对象)和View(延迟计算的Range)。常见问题包括混淆Range与Container、忽视View的延迟性和错误修改只读View。要避免错误,需理解Range概念、明确操作执行时机并检查View的可变性。代码示例展示了如何过滤并平方vector中的奇数,体现Range的使用。范围库带来了代码的简洁和效率,但理解其工作原理至关重要。
288 0
|
存储 运维 监控
复星健康集团陈清阳:云边端协同一体化,构建新一代双SaaS星医平台
上海复星健康科技(集团)有限公司技术总监陈清阳在【一云多形态】专场中带来了题为《云边端协同一体化,构建新一代双SaaS星医平台》的主题演讲,围绕复星健康集团在双SaaS服务建设过程中选型思考、集团数据能力建设、混合语音组网解决方案、复星健康的平台化工程实践等相关话题展开分享。