我知道我应该忘记在函数式语言中进行迭代,但我不知道如何提出我的问题。
如果我有一个以升序或降序排列的整数列表,并且我有一个可能存在或不存在于列表中的任意数字,我如何循环列表以查找小于该列表的数字给定数字并返回该整数。
我只需要知道如何去做。
答案 0 :(得分:2)
您可以使用find
查找与您指定的谓词匹配的第一个元素。例如:
find even [3,5,7,6,2,3,4]
或者,您可以从左侧删除所有不需要的元素:
dropWhile (not . even) [3,5,7,6,2,3,4]
(并且可能保留第一个元素,必须是偶数)。
或者,您可以过滤掉不需要的元素
filter even [3,5,7,6,2,3,4]
或者,您可以使用递归并自行编码。
答案 1 :(得分:0)
您可以使用模式匹配递归解构列表:
searchList :: Int -> [Int] -> ???
searchList n [] = ???
searchList n (x:xs) = ???
您检查x是否是您想要的号码,如果不是,您可以拨打searchList n xs
来搜索列表的其余部分。
执行类似操作的常规方法是使用库函数foldr
,但最好先了解如何使用递归执行此操作。
答案 2 :(得分:0)
您可以通过使用折叠在列表迭代中使用“状态” - 状态在函数参数中从一次迭代传递到下一次迭代。
一个例子:
sup :: [Int] -> Int -> Int
sup xs y = go (head xs) xs
where
go s [] = s
go s (x:xs) = if x >= y then s else go x xs
此处s
是“州” - 它是列表中的最新值,小于y
。
因为您说输入列表永远不会为空,head xs
在这里没问题。
这几乎就是你想要的。也许你可以修改它来处理你的所有条件。