原文发布时间为: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

.net3.5下使用LINQ递归算法实现简洁代码的更多相关文章

  1. 【原】Mac下统计任意文件夹中代码行数的工具——cloc

    这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按 ...

  2. jQuery下拉友情链接美化效果代码分享

    这篇文章主要介绍了jQuery下拉友情链接美化效果,很实用的代码,推荐给大家,有需要的小伙伴可以参考下. 文实例讲述了jQuery下拉友情链接美化效果,jQuery下拉友情链接美化代码是一款基于jQu ...

  3. mui点击加载,下拉刷新,上下整合代码

    mui点击加载,下拉刷新,上下整合代码 mui的是上拉加载,但是老大说要做成点击加载,所以就改了一些 代码应该是有些问题的,测到了大家就自己改下. 首先要说明的是,有下拉刷新的页面一定要是双webvi ...

  4. html5实现移动端下拉刷新(原理和代码)

    这篇文章给大家介绍的内容是关于html5实现移动端下拉刷新(原理和代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 移动端的下拉刷新是一个很常见的功能,也有许多开源库实现了这个功 ...

  5. eclipse下使用git上传(下载)代码至(从)github

    eclipse下使用git插件上传代码至github 1.eclipse下安装git 正常情况下,eclipse 是自带 git 插件的,那么即可跳至步骤1的最后一小步,配置 git . 如果十分悲剧 ...

  6. 【原】Mac下统计任意文件夹中代码行数的工

    [链接][原]Mac下统计任意文件夹中代码行数的工http://www.cnblogs.com/wengzilin/p/4580646.html

  7. 跨平台移动开发 Xuijs超轻量级的框架 Dom与Event简洁代码实现文本展开收起

    Dom与Event简洁代码实现文本展开收起 Xuijs超轻量级的框架 Dom与Event实现文本展开收起 效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C/ ...

  8. @Java web程序员,在保留现场,服务不重启的情况下,执行我们的调试代码(JSP 方式)

    一.前言 类加载器实战系列的第六篇(悄悄跟你说,这篇比较水),前面5篇在这里: 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证) 还是Tomcat,关于类加载器的趣味实验 了不得, ...

  9. c++命令提示符窗体下打印指定大小的菱形代码

    c++命令提示符窗体下打印指定大小的菱形代码 VS2010下,新建空项目.加入源文件,将代码粘贴进去就能够了. 通过改maxRows值的大小,能够控制菱形的大小 #include <stdio. ...

随机推荐

  1. js控制时间显示格式

    Date.prototype.Format = function (fmt) { //author: meizz     var o = {        "M+": this.g ...

  2. gitLab 服务器搭建 (自己服务器上搭建gitLab)

    环境 lunix(ubuntu) 1:添加文件 在   /etc/apt/sources.list.d/gitlab-ce.list 中添加一行 deb https://mirrors.tuna.ts ...

  3. shell的条件判断

    .字符串判断 str1 = str2 当两个串有相同内容.长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当串 ...

  4. ATM-db-dnhandler

    import os,jsonfrom conf import settings def select(name): user_path = os.path.join(settings.BASE_DB, ...

  5. PhotoSwipe图片展示插件

    这个插件相当棒!功能也很强大,可以自行体会. 官方网址:http://www.photoswipe.com/ github地址:https://github.com/codecomputerlove/ ...

  6. linux 服务器被植入ddgs、qW3xT.2挖矿病毒处理记录

    被入侵后的现象: 发现有qW3xT.2与ddgs两个异常进程,消耗了较高的cpu,kill掉后 过一会就会重新出现. kill 掉这两个异常进程后,过一段时间看到了如下进程: 首先在/etc/sysc ...

  7. [BZOJ3312][USACO]不找零(状压DP)

    Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上 ...

  8. char* 与char[]区别

    [转] 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也 ...

  9. Diycode开源项目 搭建可以具有下拉刷新和上拉加载的Fragment

    1.效果预览 1.1.这个首页就是一个Fragment碎片,本文讲述的就是这个碎片的搭建方式. 下拉会有一个旋转的刷新圈,上拉会刷新数据. 1.2.整体结构 首先底层的是BaseFragment 然后 ...

  10. Sentry 错误监控

    错误监控:https://sentry.io 支持语言或平台: