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`函式。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP