【问题标题】:List Recursion in Functional Programming F#函数式编程 F# 中的列表递归
【发布时间】:2019-02-12 13:33:57
【问题描述】:

我正在编写一个递归函数 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

【问题讨论】:

    标签: list recursion f# functional-programming


    【解决方案1】:

    您的函数中有几个语法错误和类型检查错误。您需要正确缩进并将示例调用的参数括起来。由于您要返回类型为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 构造函数的递归调用的结果中。
    • 您也不需要第二种情况 - 如果您做对了,第一种和最后一种情况将涵盖您需要的所有选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多