【发布时间】:2021-10-23 22:46:39
【问题描述】:
我昨天开始学习 F#,但在所有新的函数式编程方面都有些吃力。
我试图理解这种使用拆分功能的合并排序实现。拆分函数定义为:
let rec split = function
| [] -> ([], [])
| [a] -> ([a], [])
| a :: b :: cs -> let (r, s) = split cs
in (a :: r, b :: s)
按照我的理解,我们获取一个列表并返回一个列表元组,将列表分成两半。如果我们在空列表上进行模式匹配,我们会返回一个空列表元组,如果我们在一个包含一个元素的列表上匹配,我们会返回一个包含该列表和一个空列表的元组,但是递归的情况让我无法理解。
a :: b :: cs 表示 a 前置 b 前置到 cs,对吗?那么这是列表至少有3个元素的情况吗?如果是这样,我们返回两个值,r 和 s,但是我之前没有看到使用过这个“in”关键字。据我所知,我们将第一个元素 a 放在 r 前,将第二个元素 b 放在 s 前,然后在列表的其余部分 cs 上拆分。但这似乎并没有将列表分成两半。
谁能帮助解释递归案例的工作原理?非常感谢。
【问题讨论】:
标签: sorting functional-programming f#