Haskell程序:检查数组是否包含给定值


在Haskell中,我们可以使用递归以及`foldr`和`elem`函数来检查数组是否包含给定值。在第一个例子中,我们将使用基例和递归情况;在第二个例子中,我们将使用`(containsValue x = foldr (\y acc -> acc || x == y) False)`函数;在第三个例子中,我们将使用`(containsValue val arr = elem val arr)`函数。

算法

  • 步骤1 - 递归函数`containsValue`的定义如下:

  • 示例1 -

containsValue _ [] = False
containsValue x (y:ys)
   | x == y = True
   | otherwise = containsValue x ys.
  • 示例2 -

containsValue x = foldr (\y acc -> acc || x == y) False.
  • 示例3 -

containsValue val arr = elem val arr.
  • 步骤2 - 程序执行将从`main`函数开始。`main()`函数控制整个程序。它被写成`main = do`。在`main`函数中,定义一个示例数组`arr`和一个示例值`val`,并将它们传递给`containsValue`。然后打印函数的结果。

  • 步骤3 - 初始化名为“arr”的变量。它将保存要搜索值的整个数组。名为“val”的变量包含要在整个数组中搜索的值。

  • 步骤4 - 函数调用后,使用`print`函数将结果打印到控制台。

示例1

在这个例子中,使用了递归,检查列表的第一个元素是否等于x。如果是,则返回`True`。如果不是,则使用列表的其余部分(ys)和x递归调用该函数。基例是列表为空的情况,在这种情况下返回`False`。

containsValue :: (Eq a) => a -> [a] -> Bool
containsValue _ [] = False
containsValue x (y:ys)
   | x == y = True
   | otherwise = containsValue x ys

main :: IO ()
main = do
   let arr = [1, 2, 3, 4, 5]
   let val = 3
   print (containsValue val arr)

输出

True

示例2

在这个例子中,使用了高阶函数`foldr`来检查列表中是否包含某个值。该函数采用一个二元函数`(\y acc -> acc || x == y)`、一个初始累加器值(`False`)和要折叠的列表(`arr`)。二元函数检查当前元素y是否等于目标值x。如果是,则返回`True`。如果不是,则返回当前累加器值。

containsValue :: (Eq a) => a -> [a] -> Bool
containsValue x = foldr (\y acc -> acc || x == y) False

main :: IO ()
main = do
   let arr = [1, 2, 3, 4, 5]
   let val = 3
   print (containsValue val arr)

输出

True

示例3

在这个例子中,`elem`函数如果在列表中找到给定值,则返回`True`,否则返回`False`。这种方法比其他方法更简单、更简洁。

containsValue :: (Eq a) => a -> [a] -> Bool
containsValue val arr = elem val arr

main :: IO ()
main = do
   let arr = [1, 2, 3, 4, 5]
   let val = 3
   print (containsValue val arr)

输出

True

结论

在Haskell中,要检查数组是否包含给定值,我们可以使用递归或`foldr`和`elem`函数。

更新于:2023年3月27日

浏览量:580

开启你的职业生涯

完成课程获得认证

开始学习
广告