如何解决返回原始列表中所有偶数元素的列表-如何在不使用递归的情况下编写此函数?
此函数获取一个列表,并返回原始列表中所有偶数元素的列表。我正在尝试找出如何使用foldl
,foldr
或map
来做到这一点,但我似乎无法弄清楚。
fun evens [] = []
| evens (x::xs) =
if
x mod 2 = 0
then
x::evens(xs)
else
evens(xs);
解决方法
由于所需元素的数量少于开始的数量,因此map
已用完。
如果您同时使用foldl
和foldr
复制列表,
- foldl (op ::) [] [1,2,3];
val it = [3,1] : int list
- foldr (op ::) [] [1,3];
val it = [1,3] : int list
您看到foldl
将其撤消,因此foldr
是您保持订单顺序的自然选择。
现在您所需要的是一个将数字精简到列表的函数,否则将仅生成列表。
像这样一个:
fun cons_if_even (x,xs) = if x mod 2 = 0 then x::xs else xs
然后你有
fun evens xs = foldr cons_if_even [] xs
或内联
fun evens xs = foldr (fn (y,ys) => if y mod 2 = 0 then y::ys else ys) [] xs
使用标准过滤功能更“自然”:
fun evens xs = filter (fn x => x mod 2 = 0) xs
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。