前段时间,我写一个树的访问算法的时候,用了Visitor模式把访问的算法分离了出来,当时打算用lambda表达式写visit算法的,却发现带递归调用的lambda表达式没想象的那么好写,憋了半天愣是没写出来,由于当时赶进度,就写成了普通的函数了。

今天晚上研究了一下递归调用的Lambda表达式的写法,发现也还是比较简单的,就是脑袋要转个弯(可能当时这个弯没有转过来),首先给一个简单的示例:

int i = 1;

RecursiveRun(self =>

{

Console.WriteLine("hello world " + i++);

self();

});

static void RecursiveRun(Action<Action> action)

{

action(() => RecursiveRun(action));

}

可能有人说函数RecursiveRun是无参数的,基本上没什么用,下面这个就是带一个参数的版本了(如果需要更多的参数的版本,直接把RecursiveRun函数稍稍修改即可):

static void RecursiveRun<T>(T obj, Action<T, Action<T>> action)

{

action(obj, o => RecursiveRun(o, action));

}

通过这个函数,就可以把二叉树的遍历算法用lambda表达式给表示出来了:

class BinTree

{

public int Value { get; set; }

public BinTree Left { get; set; }

public BinTree Right { get; set; }

public BinTree(int value)

{

this.Value = value;

}

public void Accept(Action<BinTree> visitor)

{

visitor(this);

}

public void Accept(Action<BinTree, Action<BinTree>> visitor)

{

visitor(this, node => node.Accept(visitor));

}

public override string ToString()

{

return Value.ToString();

}

}

var nodes = Enumerable.Range(0, 5).Select(i => new BinTree(i)).ToArray();

nodes[0].Left = nodes[1];

nodes[0].Right = nodes[2];

nodes[1].Left = nodes[3];

nodes[1].Right = nodes[4];

nodes[0].Accept((node, visitor) =>

{

Console.WriteLine(node.Value);

if (node.Left != null)

visitor(node.Left);

if (node.Right != null)

visitor(node.Right);

});

转载于:https://www.cnblogs.com/TianFang/archive/2011/08/25/2153793.html

编写递归调用的Lambda表达式相关推荐

  1. 方法的直接调用,反射调用与……Lambda表达式调用

    方法的直接调用,反射调用与--Lambda表达式调用 2008-11-24 09:59 by Jeffrey Zhao, 32557 阅读, 100 评论, 收藏, 编辑 想调用一个方法很容易,直接代 ...

  2. java lambda 反射_反射调用与Lambda表达式调用

    想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用--至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验 ...

  3. C ++匿名函数:揭开C++ Lambda表达式的神秘面纱

    潜意识编程:揭秘C++ Lambda表达式的神秘面纱 Subconscious Programming: Unveiling the Mystery of C++ Lambda Expressions ...

  4. Java8函数式编程_9--使用Lambda表达式编写并发程序

    1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...

  5. 【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )

    文章目录 I . Lambda 表达式 简介 II . Lambda 表达式语法 III . Lambda 表达式类型 IV . Lambda 表达式返回值 V . Lambda 表达式调用 VI . ...

  6. c++ 调用system 不显示黑框_Java回调的四种写法:反射+直接调用+接口调用+Lambda表达式...

    疫情期间"闭关修炼",吃透这本Java核心知识,跳槽面试不心慌 2020"闭关"跳槽季,啃透分布式三大技术:限流.缓存.通讯 2020春招必备:MySQL(20 ...

  7. Java基础巩固(二)异常,多线程,线程池,IO流,Properties集合,IO工具类,字符流,对象流,Stream,Lambda表达式

    一.异常,多线程 学习目标 : 异常的概述 异常的分类 异常的处理方式 自定义异常 多线程入门 1 异常的概述 1.1 什么是异常? 异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程 ...

  8. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

  9. C++11:Lambda表达式(匿名函数)理解

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...

最新文章

  1. Unity初步 基本拼图实现
  2. 创立一家互联网公司,需要几步?
  3. http Error 503 server unavailable
  4. Android学习第三天--事件监听器
  5. 经典算法题--求对策字符串的最大长度
  6. HDU 2503 a/b + c/d(最大公约数与最小公倍数,板子题)
  7. Android开发 匹配软键盘回车键
  8. 火狐浏览器设置无图模式
  9. Visual C++ 2010 第4章 数组、字符串和指针
  10. 上|中国股市九大伪元宇宙概念股
  11. 客户端设置超时,max_fails失效----问题分析
  12. 面向大规模数据的云端管理,百度沧海存储产品解析
  13. 面试题-评价一下你之前公司的领导、同事或之前学校中的导师、同学
  14. 30个HTML+CSS前端开发案例(五)
  15. 1 Tensorflow - 30行代码搞定手写识别
  16. 报错:Use /* eslint-disable */ to ignore all warnings in a file.
  17. 五行Python自动换你的电脑桌面壁纸(内附源码和exe)
  18. 干货 | 免费GIS数据网站推荐
  19. Cydia Tweak--Cydia Substrate
  20. java中的锁---乐观锁与悲观锁的区别

热门文章

  1. Thread系列之Thread.Join()
  2. 利用霍夫梯度法进行圆检测的原理概要及OpenCV代码实现
  3. linux嵌套字幕工具,Linux(NAS通用)下自动匹配射手字幕脚本
  4. php判断日期为空值,php判断值是否为空实例代码
  5. DPDK vhost-user研究(十三)
  6. git status清空_Git常见命令和遇到问题的解决办法
  7. pyqt5 输入确认_对PyQt5的输入对话框使用(QInputDialog)详解
  8. 微服务网关Kong 1.0正式发布!提供100+项功能
  9. 物化视图基于rowID快速刷新
  10. [MFC] MFC 打开HTML资源(用ID版,也可加载到自己的web控件上)