文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用Lambda表达式编写递归

2023-06-17 08:59

关注

这篇文章主要介绍“如何使用Lambda表达式编写递归”,在日常操作中,相信很多人在如何使用Lambda表达式编写递归问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Lambda表达式编写递归”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

递归参数及返回值类型假定

对于常见的递归函数,如:阶乘、斐波那契数列求值,我们先作如下假定:

参数为 int 类型(Int32);

返回值为 long 类型(Int64)。

基于假推断各类型

FIX g 类型

根据上篇文章中的描述:

FIX g = λn. (ISZERO n) 1 (MULT n ((FIX g) (PRED n)))FIX g 55 = 5 * (4 * (3 * (2 * (1 * 1))) = 120

FIX g 返回的是我们需要的递归函数,这个递归函数

·接收一个 int 参数(上面假定第 1 条)值为 5

·返回一个 long 型数值(上面假定第 2 条)120。

因此,确定出 FIX g 的类型可表示为 Func<int, long>。

同时也能看出 n 是递归函数的参数,n 类型为 int。

g 类型

阶乘单步函数如下:

g = &lambda;f. &lambda;n. (ISZERO n) 1 (MULT n (f (PRED n)))

c# 中可表达为:g => f => n => n == 0 ? 1 : n * f(n &ndash; 1)

先来推断 f 的类型:

&middot;f 的参数:f 接收 n &ndash; 1 作为参数,因此,f 参数的类型和 n &ndash; 1 类型相同,即 n 的类型:int;

&middot;f 的返回值:为 0 时返回 1,否则返回 n * f(n-1),f 的返回值类型也就是整个递归函数的返回值类型,即 long。

可确定 f 类型为 Func<int, long>。

n => n == 0 ? 1 : n * f(n &ndash; 1) 是传入一个 int 返回一个 long,其类型 Func<int, long>。

先来变换下 g 的表示形式:

var g = (Func<int, long> f) => {      Func<int, long> t =           n => n == 0 ? 1 : n * f(n - 1);      return t;  };  // 示意代码

从上面这段代码可以清楚到看出 g 接收一个 Func<int, long> 类型的参数 f,返回一个类型为 Func<int, long> 的委托,可得出:

g 的类型为 Func<Func<int, long>, Func<int, long>>

FIX 类型

FIX g 可写作 FIX(g),可以看出: FIX g 的类型 == FIX(g) 的类型 == FIX 返回值的类型。前面得知 FIX g 类型为 Func<int, long>,也就可推出 FIX 返回值类型为 Func<int, long>。

FIX 接受 g 作为参数,FIX 的参数类型也就是 g 的类型,可知 FIX 参数类型为 Func<Func<int, long>, Func<int, long>>。

由此得出 FIX 的类型为:Func<Func<Func<int, long>, Func<int, long>>, Func<int, long>>。

(估计这是多数开发人员见过的最复杂的泛型了。后面还在更复杂的吆!)

小结

名称&lambda; 演算表达式数据类型
输入参数nint
迭归返回值FIX g nlong
迭归函数FIX gFunc<int, long>
单步函数gFunc<Func<int, long>, Func<int, long>>
不动点组合子FIXFunc<Func<Func<int, long>, Func<int, long>>, Func<int, long>>

通用类型

基于以上部分的推演和小结,我们可以归纳出通用类型:

名称&lambda; 演算表达式数据类型
输入参数nTInput
迭归返回值FIX g nTResult
迭归函数FIX gFunc<TInput, TResult>
单步函数gFunc<Func<TInput, TResult>, Func<TInput, TResult>>
不动点组合子FIXFunc<Func<Func<TInput, TResult>, Func<TInput, TResult>>, Func<TInput, TResult>>

基于本文推断出的类型,不动点组合子转换为 c# 代码了不容易多了。

到此,关于“如何使用Lambda表达式编写递归”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯