F#列表包含

时间:2018-11-15 20:40:08

标签: list recursion f# boolean contains

我需要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 =

2 个答案:

答案 0 :(得分:4)

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

首先需要做的一件事是避免两次使用名称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函数的单个递归调用。

答案 1 :(得分:2)

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

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

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

顺便说一句,该函数不仅适用于整数列表;它将自动归纳为可与支持相等比较的任何类型的列表一起使用。