我需要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 =
答案 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
顺便说一句,该函数不仅适用于整数列表;它将自动归纳为可与支持相等比较的任何类型的列表一起使用。