.net3.5下使用LINQ递归算法实现简洁代码
原文发布时间为:2011-04-24 —— 来源于本人的百度文章 [由搬家工具导入]
http://www.cnblogs.com/wintersun/archive/2009/03/29/1424352.html
.net framework 3.5 有了Linq使得对委托有了更多的支持,下面让我们来看几个有趣的示例.通常情况下,我们实现一个递归算法要写一个函数,同时还有调用的几行代码.
现在来看使用Linq的如何实现简洁的代码,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
public class Recursion
{
private delegate Func<A, R> Recursive<A, R>(Recursive<A, R> r);
public static Func<A, R> Y<A, R>(Func<Func<A, R>, Func<A, R>> f)
{
Recursive<A, R> rec = r => a => f(r(r))(a);
return rec(rec);
}
}
class Program
{
static void Main(string[] args)
{
}
public void Factorial2()
{
var dd = Recursion.Y<int, int>(h => m => (m == 1) ? 1 : h(m - 1) * m);
Console.WriteLine(dd(5));
}
public void RecursionGetFiles()
{
var RecGetFiles =
Recursion.Y<string, IEnumerable<string>>
(f => d =>Directory.GetFiles(d).Concat(Directory.GetDirectories(d).SelectMany(f)));
foreach (var f in RecGetFiles(Directory.GetCurrentDirectory()))
Console.WriteLine(f);
}
}
}
Factorial是阶乘,接着是Fibonacci数列.之后把这个定义为一个名叫Funcional类,其中包含一个static方法.Factorial2使用这个类再实现阶乘,是不是简单的多.接着是RecursionGetFiles一个实际的应用,递归遍历文件夹取得文件名列表.像树型结构算法都可以用它来实现,是不是很有趣?
其中几个关键方法可以参考:
Func<(Of<(T,TResult>)>) 委托
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
Enumerable.SelectMany<(Of<(TSource,TResult>)>) 方法 (IEnumerable<(Of<(TSource>)>), Func<(Of<(TSource, IEnumerable<(Of<(TResult>)>)>)>))
将序列的每个元素投影到 IEnumerable<(Of<(T>)>) 并将结果序列合并为一个序列。
Enumerable.Concat<(Of<(TSource>)>) 方法
连接两个序列。
Author: Petter Liu http://wintersun.cnblogs.com
最新文章
- SVN搭建简单教程
- JSON的一点:
- ELK日志管理之——elasticsearch部署
- [codeforces 241]A. Old Peykan
- Web自动化框架LazyUI使用手册(2)--先跑起来再说(第一个测试用例-百度搜索)
- [PHP] htaccess 探秘
- node笔记——gulp-imagemin图片压缩
- node.js 入门教程(beginnder guide
- 计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)
- 集美大学网络1413第十一次作业成绩(团队七) -- Alpha冲刺之事后诸葛亮
- spring mvc 整合Quartz
- RHEL 6 mdadm 实现Soft Raid
- 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
- 【原创】大数据基础之Zookeeper(4)应用场景
- 【转】javaUDP套接字通信
- 列式数据库~clickhouse 副本集架构的搭建
- Big Number-Asia 2002, Dhaka (Bengal) (计算位数)题解
- epoll对poll(select)的改进
- intellJ IDE 15 生成 serialVersionUID
- 使用SQL Server连接xml接口,读取并解析数据
热门文章
- springboot中加入druid对sql进行监控
- 科学计算库Numpy——数组形状
- 解决cmd目录下pip命令不存在的问题
- 3 View - Request对象
- Java多线程-join方法
- vrpie在Visio Studio 中无法调试的问题
- IOS开发---菜鸟学习之路--(二十一)-利用正则表达式解析URL获取其中的参数
- 【Best Time to Buy and Sell Stock II】cpp
- 如何将Linux rm命令删除的文件放入垃圾箱
- [19/02/23]ToolsShare 工具分享 VPNTethering Android (Root Required)