f# - 在 f# 中反转链表数据类型的顺序
问题描述
我必须颠倒使用以下数据类型的链表的顺序:
type IntList =
| Nil
| Cons of int * IntList
我曾尝试使用单独的“附加”方法,但我想知道一种使用单个函数的方法
let rec append num lst =
match lst with
| Nil -> Con (num,Nil)
| Cons (hd,tl) -> L (hd ,append num tl)
let rec reverse lst =
match lst with
| Nil -> Nil
| Cons (hd,tl) -> append hd (reverse tl)
解决方案
通过使用累加器变量,您可以在一个函数中使用它。当您递归到列表的末尾时,您什么都不做,而是保留一个变量,当您从递归返回到列表的开头时,该变量将存储结果。
当您到达列表末尾时,您只需返回最初是一个空列表的 acuumulator,然后将所有元素添加到其中,同时返回。
由于您将累加器作为递归函数参数,因此最好将其包装在一个除了提供累加器初始值之外什么都不做的函数中。
type IntList =
| Nil
| Cons of int * IntList
let reverse lst =
let rec reverseHelper lst acc =
match lst with
| Nil -> acc
| Cons (hd,tl) -> reverseHelper tl (Cons (hd, acc))
reverseHelper lst Nil
推荐阅读
- python - kivymd 卡在循环的帮助下滚动列表项目?
- python - 根据python中的索引将列表列表中的值替换为另一个列表的值
- python - 按日期将python数组字段排序为日期字符串
- twilio - 调用外部 API 的 Twilio 函数 - 无效的 Content-Type 错误代码 12300
- amazon-web-services - 将 EBS 快照复制到另一个区域
- rust - 从具有自链接生命周期的可变引用获取不可变引用时有什么区别?
- mysql - 如何使 MySQL 8 与 MySQL 5.7 兼容?
- autodesk-forge - 设计自动化 API - 令牌刷新
- android - 赛马林;Android 11.0 SDK 在 Visual Studio 中不可用;目标框架
- microsoft-teams - 当我在 Teams 中旁加载 Microsoft Teams Toolkit 时,找不到个人应用程序