【问题标题】:F# List containsF# 列表包含
【发布时间】:2019-04-19 00:50:30
【问题描述】:

我需要 F# 方面的帮助。我需要验证列表中是否存在一个数字,使用递归函数而不使用List.contains 或类似的东西。该程序应该只告诉我它是真还是假。例如:

contains(8N, [3N; 8N; 2N]) = true
contains(7N, [3N; 8N; 2N]) = false

到目前为止我所拥有的:

let rec contains(x: Nat, list: Nat list): bool =
    match list with 
    | [] -> false
    | x::xs when x =

【问题讨论】:

  • 请添加您目前拥有的代码。
  • 因为这是家庭作业,所以这里是一个提示,而不是一个完整的答案。对于 F# 列表,您通常希望将列表分为第一项和其余项,然后对第一项进行一些操作,并在列表的其余部分上递归调用您的函数。最终列表的其余部分将为空,此时您不再进行任何递归调用。
  • let rec contains(x: Nat, list: Nat list): bool = match list with | []->假| m::xs 当 x =

标签: list recursion f# boolean contains


【解决方案1】:

到目前为止,您拥有的代码是一个很好的起点。我将 Nat 替换为 int,这是 F# 使用的类型名称,并将元组参数替换为空格分隔的参数,这是一种更常见的表示法。

您首先需要做的一件事是避免使用名称 x 两次 - 现在,您将 x 作为您要查找的号码的名称,并将其作为第一个元素的名称列表。一旦你重命名它们,你可以在when中指定条件:

let rec contains (lookingFor:int) (list:int list) : bool =
    match list with 
    | [] -> false
    | firstInList::restOfList when firstInList = lookingFor -> (...)
    | firstInList::restOfList -> (...)

现在,您需要处理两件事:

  • firstInList = lookingFor时,你想返回true
  • 否则(我添加的最后一种情况),您需要进行递归调用。您知道 firstInList 不是您要查找的号码,您需要检查 restOfList 是否包含该号码 - 这是对您的 contains 函数的一次递归调用。

【讨论】:

    【解决方案2】:

    这个想法很简单:遍历一个列表并检查它的第一个元素是否等于你正在寻找的那个。如果是,则返回 true,否则继续搜索列表的其余部分。如果(原始或剩余)列表为空,则没有元素满足条件,因此结果为假。

    这可以非常紧凑地建模为一个小的递归函数:

    let rec contains n = function
        | [] -> false
        | x :: xs -> (n = x) || contains n xs
    

    顺便说一下,这个函数不仅适用于整数列表;它将自动泛化以处理支持相等比较的任何类型的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多