List F#列表包含

List F#列表包含,list,recursion,f#,boolean,contains,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

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

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

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

let rec contains (lookingFor:int) (list:int list) : bool =
    match list with 
    | [] -> false
    | firstInList::restOfList when firstInList = lookingFor -> (...)
    | firstInList::restOfList -> (...)
现在,您需要处理两件事:

  • firstInList=looking查找时,您希望返回
    true
  • 否则(我添加的最后一个案例),您需要进行递归调用。您知道
    firstInList
    不是您要查找的号码,您需要检查
    restOfList
    是否包含该号码-这是对
    contains
    函数的一个递归调用

    • 想法非常简单:遍历一个列表,检查它的第一个元素是否与您要查找的元素相同。如果是,则返回true,否则继续搜索列表的其余部分。如果(原始或剩余)列表为空,则没有元素满足该条件,因此结果为false

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

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

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

      请添加到目前为止的代码。因为这是家庭作业,所以这里是一个提示,而不是完整的答案。对于F#列表,通常需要将列表分为第一项和其余项,然后对第一项执行一些操作,并对列表的其余部分递归调用函数。最后,列表的其余部分将为空,此时不再进行任何递归调用=