list - 函数式编程 F# 中的列表递归
问题描述
我正在编写一个递归函数move,它需要两个列表并将第一个列表中的元素以相反的顺序插入到第二个列表中。
我们有一个预定义的列表数据类型
type ilist = E | L of int * ilist
例如:
move L(2, L(3, E)) L(1, L(2, E))
会给我
L(3, L(2, L(1, L(2))))
我认为我的代码存在语法错误。也不确定我是否可以使用 cons 预先设置,因为它是预定义的列表数据类型。任何帮助表示赞赏!
let rec move l r =
match l with
| E -> []
| L(h,E) -> h::r
| L(h,t) -> move t r
解决方案
您的函数中有几个语法错误和类型检查错误。您需要正确缩进并将示例调用的参数括起来。由于您要返回类型为 的现有列表,因此ilist
您还需要在右侧实现中用构造函数和替换[]
和。解决问题给出:::
L
E
let rec move l r =
match l with
| E -> E
| L(h,E) -> L(h, r)
| L(h,t) -> move t r
move (L(2, L(3, E))) (L(1, L(2, E)))
这运行,但它并不完全正确。要真正让它做你想做的事,你需要:
- 在第一种情况下,如果你打电话,
move E (L(1, E))
你应该回来L(1, E)
,但你的实现只是返回E
。你需要返回r
。 - 在最后一种情况下,你没有使用
h
,所以它会被丢弃。您需要使用构造函数将其附加到r
递归调用的值或结果中。L
- 您也不需要第二种情况 - 如果您做对了,第一种和最后一种情况将涵盖您需要的所有选项。
推荐阅读
- java - 始终添加到最后一个 Listitem 位置并保持它
- android - 如何在测验应用程序中检查洗牌数组的答案
- google-visualization - 具有多个数据的谷歌折线图
- python - 尝试在 python2 中创建有限的数字序列:IndexError(初学者)
- ios - 在 URLSession.shared.dataTask(with: url) 中执行SegueWithIdentifier
- c# - 将工作委托给彼此的 2 个虚拟方法的良好实践
- sql - sql server 中根级别的 sql 搜索
- linq - 当通用存储库与 List 一起使用时,Linq 到实体给出错误
目的 - android - 保护问题
- java - Java初学者租赁计划