微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回原始列表中所有偶数元素的列表-如何在不使用递归的情况下编写此函数?

如何解决返回原始列表中所有偶数元素的列表-如何在不使用递归的情况下编写此函数?

函数获取一个列表,并返回原始列表中所有偶数元素的列表。我正在尝试找出如何使用foldlfoldrmap来做到这一点,但我似乎无法弄清楚。

fun evens [] = []
    | evens (x::xs) =
        if
            x mod 2 = 0
        then
            x::evens(xs)
        else
            evens(xs);

解决方法

由于所需元素的数量少于开始的数量,因此map已用完。
如果您同时使用foldlfoldr复制列表,

- 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 举报,一经查实,本站将立刻删除。