递归
文章平均质量分 64
心想才事成
这个作者很懒,什么都没留下…
展开
-
12.2.1 递归的序列表达式
12.2.1 递归的序列表达式 函数式编程中主要的控制流结构是递归。我们已经在很多例子使用过,写普通的函数,能够解决命令式编程中的循环问题,而不需依赖可变状态。当我们想写一个简单的递归函数时,使用 let rec 关键字,允许函数以递归方式调用自身。 用于组合序列的 yield! 结构,也可以在序列表达式中执行递归调用,所以,我们可以使用相同的函数编程技术生成序列。清翻译 2011-11-09 16:53:55 · 788 阅读 · 0 评论 -
7.3 表示结构化文档
7.3 表示结构化文档 在这一节我们所设计的数据结构,灵感来自 HTML 格式,这是我们熟悉的,成功创建文档的语言。就像 HTML 一样,我们表示的内容有几种类型,并且有些部分可能以适当的方法嵌套。图 7.3 显示了带注释的示例文档,它能给你格式包括哪些内容的概念。有两种不同的部分。简单的部分,如 TextPart 和 ImagePart,包含内容,但不包含嵌套的部分;在另一侧,Tit翻译 2014-11-25 15:23:13 · 1262 阅读 · 0 评论 -
7.3.1 转换表示
7.3.1 转换表示 在我们实现数的据类型之间,存在两个关键的不同:[两个不同,怎么出现三项]1、在新的表示形式中,文件是一个(递归)值,而在第一种情况下,是元素的列表。2、第 7.2 节的数据类型显式包含边框,指定内容的位置。3、第二个数据类型,只表示各部分是如何嵌套的。因此,当我们进行表示形式的转换时,需要计算每个嵌套部分的位置。这些差异影响转换函数的签名,在我翻译 2014-11-25 17:34:14 · 838 阅读 · 0 评论 -
4.4.2.3 用函数绘图
4.4.2.3 用函数绘图 DrawStep 函数的第一个参数是两个绘图函数中的一个,我们暂时先给这个绘图函数的类型命名为 DrawingFunc,以后再定义。在讨论其余的参数之前,我们先看一下这个函数的签名: drawStep : (DrawingFunc * Graphics * float* (string * int) list) -> unit 我们再次使用元组语翻译 2014-10-15 11:34:07 · 895 阅读 · 0 评论 -
6.7.1 用F# 实现列表
6.7.1 用F# 实现列表 虽然我们已经使用过 F# 中的列表,还用 C# 实现了相同的功能,但还没有研究如何用F# 实现列表类型。当我们前面讨论列表时,看到列表既可以表示为空值(nil)(空列表),也可以表示包含元素和引用列表其余部分的 cons cell。现在,如果我们回顾上一章中有关值的内容,这就像是有两个选项的可选值;微有一点稍不同,列表类型是递归的,因此,cons cell翻译 2014-11-18 14:48:45 · 928 阅读 · 0 评论 -
4.2.1 加载和解析数据
4.2.1 加载和解析数据 作为第一步,我们将实现一个函数 convertDataRow,从 CSV 文件中取一行作为字符串,把这一行拆成两部分,以元组形式返回。函数实现后,就可以立即进行测试,输入一个样本(字符串"Test reading,1234”),应该能够正确解析。清单 4.2 是函数的代码和测试结果。 清单 4.2 解析 CSV 文件的一行 (F# Interactive翻译 2014-10-09 17:20:39 · 731 阅读 · 0 评论 -
3.3 列表和递归
3.3 列表和递归 不可变的函数式数据类型,元组是一个很好的例子,但许多函数式数据类型,还有另外的属性值得在这一章讨论:递归(recursion)。有一个经典的编程笑话:递归的定义是什么?“递归,参见递归。”递归在函数编程中有不同的形式,它可以出现在类型的构造中,如列表。表示函数式列表类型,既可以为空,也可以由元素和列表组合而成。可以看到,我们描述的列表类型,递归用在了定义中。递归的第翻译 2014-09-23 08:39:53 · 946 阅读 · 0 评论 -
3.3.1 递归计算
3.3.1 递归计算 递归函数最常见的示例是计算一个数的阶乘。如果你不熟悉,这里有一个简单的定义:一个非负数 n 的阶乘,当 n 等于 1 或 0 时,等于1;对于更大的 n,等于 n-1 的阶乘乘以 n。这个函数的实现,基本上有两种方式。在 C# 中,可以使用 for 循环,数字在 2 到 n 之间进行迭代,用第次迭代的数乘以临时变量: int Factorial(int n)翻译 2014-09-23 15:52:16 · 811 阅读 · 0 评论 -
2.2.3 用递归改变程序状态
2.2.3 用递归改变程序状态 现在,我们来写一此更复杂的函数,看看如何使用值。我们实现的函数,是求指定范围内的数字的和。当然你可以直接计算出和,但我们是把它作为使用循环进行计算的示例。(在 2.3.1 节,我们会把代码改成更通用的函数。) int SumNumbers(int from, int to) { intres = 0; for(int i = from;翻译 2014-08-20 11:14:06 · 843 阅读 · 0 评论 -
取出路径中的文件名
取出路径中的文件名open System.IOlet rec allFilesUnder basePath = seq { yield! Directory.GetFiles(basePath) for subdir in Directory.GetDirectories(basePath) do yield! a原创 2013-03-08 11:24:34 · 932 阅读 · 0 评论 -
16.4.5 等待多个事件
16.4.5 等待多个事件 到目前为止,所有 AwaitObservable 示例中,我们只是等待单个事件发生。矩形绘制应用程序首先等待 MouseDown 事件,然后,反复等待 MouseMove。如果想要等待有,既可能有 MouseMove 事件,也可能一些其他事件发生,又该如何呢?我们可能想要能够以某种方式,放弃绘制的新矩形。我们就来实现这种情况,使用按键作为我们的取消事件。翻译 2012-01-18 11:17:04 · 1077 阅读 · 0 评论 -
16.3.2 绘制矩形
16.3.2 绘制矩形 以函数方式解决问题是出奇的困难,用户交互在 Windows 窗体控件上绘制图形对象。假设我们想要绘制一个矩形,用户首先要在矩形的一个角上按下鼠标按钮,将光标移到对角处,然后释放按钮。在移动光标的过程中,按钮一直是按下的,应用程序绘制矩形的当前形状,释放该按钮时,它最后变成位图,或储以矢量形状列表的形式保存。 典型的命令式实现,是使用一个可变标志指定当前是翻译 2012-01-16 14:55:34 · 832 阅读 · 0 评论 -
14.3.2 设计仿真操作
14.3.2 设计仿真操作 在本节中,我们会考虑需要实现仿真的操作。现在,我们不会实现所有困难的操作,因为,我们只想要设计应用程序的结构。我们的首要目标是用最小的努力,运行这个应用程序,然后,再回到有趣的部分,比如,描述动物和捕食者的动作的算法。 以典型函数的方式,我们将从一些初始状态开始,并在每一步中,会基于上一个状态,创建新的状态。这意味着,我们需要一个操翻译 2011-12-07 17:40:16 · 809 阅读 · 0 评论 -
13.2.2 从故障中恢复
13.2.2 从故障中恢复世界银行服务对每个用户密钥每天请求数量有限制,还限制了请求的频率,因此,如果我们一次运行大量的请求,有可能会出错。解决的方法是捕获异常,稍后重试请求。 清单 13.7 实现的循环,重复执行请求,直到成功,或者尝试 20 次为止。使用异常报告失败,使用 F# 的 try … with 结构捕捉异常。清单 13.7 重复运行 web 请求 (交互式 F#)> let worl翻译 2017-01-13 22:20:49 · 289 阅读 · 0 评论