欢迎访问我的博客 https://javascript.shop

.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

posted @ 2017-07-14 00:56  孑孓子  阅读(169)  评论(0编辑  收藏  举报
欢迎访问我的博客 https://javascript.shop