zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    pat1111-1120
    pat1101-1110
    pat1091-1100
    pat1081-1090
    pat1071-1080
    pat1061-1070
    2017华为软件精英挑战赛总结
    pat1051-1060
    【转】WPF中PasswordBox控件的Password属性的数据绑定
    Python学习-41.Python中的断言
  • 原文地址:https://www.cnblogs.com/handboy/p/7164010.html
Copyright © 2011-2022 走看看