【问题标题】:Return true if x is in list else False (Recursion)如果 x 在列表中,则返回 true,否则返回 False(递归)
【发布时间】:2023-05-22 05:24:01
【问题描述】:

我正在编写一个简短的递归函数以将列表作为输入并输出 Bool。 (我是 haskell 初学者)到目前为止,我可以检测到第一个元素是否为 3,但我不确定如何使用递归来检查列表的其余部分。

func :: [Int] -> Bool
func [] = False
func (x:xs)
  | (x == 3)           = True
  | otherwise          = False

【问题讨论】:

  • otherwise = func xs
  • 如果收到良好,您可以考虑将您的回复(加上更多解释)作为答案。

标签: list haskell


【解决方案1】:

我也是 Haskell 的新手。

对你的代码稍作改动,就可以改写为

func :: [Int] -> Bool
func [] = False
func (x:xs)
  | x == 3    = True
  | otherwise = func xs

解释:

  • 如果列表为空:没有3
  • 如果列表不为空:
    1. 如果 head 是 3,那么我们有 3
    2. 否则我们应该检查列表的其余部分,因此“3 在列表中”的答案等同于“x 在 xs 中”。

如果你接受一点改变,我可以建议使用 OR(以及惰性求值的帮助)来实现。

func :: [Int] -> Bool
func [] = False
func (x:xs) = x==3 || func xs

其实和上面的代码一样,只是行数少了。

  • 如果 head 为 3,则返回 True。
  • 如果 head 不是 3,请检查列表的其余部分。

最后,我想给大家介绍一下elem函数,它的作用是:获取一个元素和一个列表,如果a在列表中则返回True,否则为False。 这正是我们想要的,所以我写:

containsThree :: [Int] -> Bool
containsThree = elem 3  

还要注意,我使用的是无点样式,如果你不熟悉,第二行是一样的:

containsThree xs = elem 3 xs  

祝你学习 Haskell 好运。

【讨论】:

  • 我会注意到elem 通常写成中缀运算符3 `elem` xs,这样读起来更容易理解,例如数学符号 3 ∈ xs
最近更新 更多