首页 > 解决方案 > 函数式编程 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

标签: listrecursionf#functional-programming

解决方案


您的函数中有几个语法错误和类型检查错误。您需要正确缩进并将示例调用的参数括起来。由于您要返回类型为 的现有列表,因此ilist您还需要在右侧实现中用构造函数和替换[]和。解决问题给出:::LE

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
  • 您也不需要第二种情况 - 如果您做对了,第一种和最后一种情况将涵盖您需要的所有选项。

推荐阅读