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`函数。