.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