【问题标题】:F# : need help reversing order of ilistF#:需要帮助反转 ilist 的顺序
【发布时间】:2019-02-12 00:50:18
【问题描述】:

我必须使用以下数据类型:

type ilist = E | L of int * ilist

我似乎无法在使用标准类型在线 ([1;2;3] ) 之外的列表方面找到太多帮助

我要写一个函数,它接受一个列表并颠倒顺序

例如:反向 (L(1, L(2, L(3, E)))) 将输出 (L(3, L(2, L(1, E))))

到目前为止,这是我的代码:

 let rec reverse l = 
     match l with 
     | E -> failwith "Empty List"
     | L(h, E) -> h
     | L(h, t) -> // append tail and recursive call with rest of list?

 let list = reverse (L(1, L(2, L(3, E))))
 printfn "reversed list: %A" list

感谢您的帮助!

【问题讨论】:

  • Operations on sublists的可能重复
  • 在链接副本中,仍然使用内置列表类型,但定义了函数。您只需将[] 替换为E 案例,将head :: tail 替换为L (head, tail) 案例。
  • 这看起来像是他们将列表分解为子列表?所以我相信这不是一个重复的问题,还是只是为了参考?
  • 原来的问题有点不同,但答案是一样的。接受的答案中的反向功能应该是您所需要的。

标签: list f#


【解决方案1】:

您缺少的是一种将int 附加到ilist 的便捷方法:

let rec append x l =
  match l with
  | E       -> L (x,E)
  | L (h,t) -> L (h,append x t)

printfn "%A" (append 4 list)

现在在最后一个匹配案例中使用此函数将h 附加到反向的t

let rec reverse l = 
  match l with 
  | E       -> E
  | L (h,t) -> append h (reverse t)

请注意,当输入列表为空 (| E -> E) 时,最好只返回一个空列表,因为 failwith 非常丑陋,您应该只在极少数情况下使用。

另请注意,您的第二个匹配案例 | L(h, E) -> h 是错误的,因为它返回 int 而不是 ilist。但无论如何都不需要它,所以只需将其删除即可。单例列表L (h,E) 将与| L (h,t) -> ... 匹配,而后者又递归地将t| E -> E 匹配。

这是一个工作示例:https://repl.it/repls/PhonyAdventurousNet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2011-08-11
    • 2010-12-15
    相关资源
    最近更新 更多