F#:递归函数:测试元素是不是是给定列表的成员

Posted

技术标签:

【中文标题】F#:递归函数:测试元素是不是是给定列表的成员【英文标题】:F#: Recursive Functions: test whether an element is a member of a given listF#:递归函数:测试元素是否是给定列表的成员 【发布时间】:2016-05-05 00:24:21 【问题描述】:

我正在尝试弄清楚如何编写代码。

在 F# 中实现一个函数,用于测试元素是否是给定列表的成员。这是我想要的类型。

val memberof : 'a * 'a list -> bool when 'a : 相等

以下是实际使用的函数示例。

成员 1 [1;2;3];; 错误FS0003:该值不是函数,不能应用

成员 (1,[1;2;3]);; 验证它:bool = true

成员 (1, []);; 验证它:bool = false

成员 (1,[2;3;4]);; 验证它:bool = false

这是我整理的...

let rec memberof l =
    match (l:float) with
    | a.Item(l) -> l -> bool + (memberof l)

let rec memberof l =
    match (l:float list) with
    | [] -> false
    | (a:float)::b -> (a)=(memberof b)->bool

【问题讨论】:

示例来自哪里?因为您的函数甚至没有正确的签名(我不是指float'a) - 另外:这是一个练习吗?因为如果您查看 List 模块,您可以找到您要查找的内容 【参考方案1】:
let rec memberof (l : float list) (item : float) : bool =
    match l with
    | hd::tl when hd = item -> true
    | hd::tl -> memberof tl item
    | [] -> false

let rec memberof (l : float list) (item : float) : bool =
    match l with
    | hd::tl ->
        if hd = item then
            true
        else
            memberof tl item
    | [] -> false

let rec memberof (l : float list) (item : float) : bool =
     match l with 
     | [] -> false 
     | hd :: tl -> 
         hd = item
         || memberof tl item

测试用例

let test001 = memberof [1.0; 2.0; 3.0] 0.0    
printfn "test001: %A" test001   

let test002 = memberof [1.0; 2.0; 3.0] 1.0  
printfn "test002: %A" test002   

let test003 = memberof [1.0; 2.0; 3.0] 2.0  
printfn "test003: %A" test003 

let test004 = memberof [1.0; 2.0; 3.0] 3.0  
printfn "test004: %A" test004   

let test005 = memberof [] 0.0    
printfn "test005: %A" test005 

哪些输出

val test001 : bool = false
val test002 : bool = true
val test003 : bool = true
val test004 : bool = true
val test005 : bool = false

问题

let rec memberof l =
    match (l:float list) with
    | [] -> false
    | (a:float)::b -> (a)=(memberof b)->bool

是吗

| (a:float)::b -> (a)=(memberof b)->bool

正确地把列表分开
 (a:float)::b

然而

 (a)=(memberof b)->bool

不对。

使用列表上的递归函数,您想要拉出列表的头部并处理头部。然后你想再次调用该函数,这次将列表的尾部作为新的列表变量传递,例如

memberof tl item

由于这是一个predicate,我们只需要在达到所需的真或假时停止。在此示例中,当找到 true 时,函数可以结束,因此无需为列表的其余部分调用 memberof

对于您要求的特定签名

val memberof : item:'a * list:'a list -> bool when 'a : 相等

let rec memberof ((item : 'a), (list : 'a list)) : bool when 'T : equality =
    match list with
    | hd::tl ->
        if hd = item then
            true
        else
            memberof (item, tl)
    | [] -> false

【讨论】:

以上是关于F#:递归函数:测试元素是不是是给定列表的成员的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 遍历元素的递归函数

递归与回溯:python列表组合问题

递归确定是不是存在与给定 int 参数匹配的正 int 数组的子集和?

不使用反向返回列表中最后一个元素的非尾递归函数?

《图解算法》--二分查找选择排序递归

排序算法----快速排序(数组形式)