【问题标题】:how to compress a List in f#?如何在 f# 中压缩列表?
【发布时间】:2020-09-30 05:59:46
【问题描述】:

您好,我是 f# 的新手,我做了这个练习,我不知道: “实现一个功能:” let compress (l : List<'a>) : List<'a> = ... 这将删除 l 中相同元素的连续出现。例如将 [a;a;a;a;b;b;c] 压缩为 [a;b;c]

我不允许使用 f# 的内置函数,需要通过模式匹配来做到这一点。

我目前的代码(不多):

let rec compress (l: List<'a>) : List<'a> = 
    match l with
    | [] -> l

感谢您的帮助!

【问题讨论】:

  • 考虑到这是一个练习,也许我只是给个提示?就像您的其他问题一样,创建一个具有额外参数last 的内部 rec 函数。将其与列表的当前头部进行比较,如果相等,则不要添加。
  • 另一个提示:为列表编写递归函数时,从内部的 rec 函数开始,除了再次构建相同的列表之外什么都不做。这将反转列表,因此在末尾添加List.rev。然后添加业务逻辑。希望这能让你朝着正确的方向前进。
  • 我不会太担心编写内部函数,我会专注于案例....一个空列表 -> 一个空列表...正确....一个列表包含 1 个元素 -> 包含 1 个元素的列表...包含 2 个或更多元素的列表...请考虑如果第一个两个元素相同会发生什么,然后考虑如果它们不同会发生什么。

标签: list functional-programming f#


【解决方案1】:

对于任何递归函数,您需要考虑:1. 终端情况和 2. 一般情况。在您的场景中:

  1. 空列表[]
  2. 非空列表 x::xs(其中 x 表示列表的头部,xs 表示其余部分也称为尾部)

构建此类函数时要考虑的另一个重要方面是假设它适用于先前的值。例如,在阶乘的情况下,我们假设该函数已经适用于之前的场景,例如n-1 的阶乘。

let fact n = 
   match n with
   | 0 | 1 -> 1
   | _ -> n * fact (n-1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2011-11-20
    • 2021-06-03
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多