【发布时间】:2018-03-22 17:26:20
【问题描述】:
我正在尝试创建一个对 ML 列表的数字求平方然后将这些数字相加的函数
fun sqsum(lst) = map (fn x => x*x) lst;
我有一个列表并返回每个数字的平方列表,但我无法弄清楚添加部分。
【问题讨论】:
-
编写一个函数
sum,将列表的元素相加而不求平方。将其应用于您的平方列表。
我正在尝试创建一个对 ML 列表的数字求平方然后将这些数字相加的函数
fun sqsum(lst) = map (fn x => x*x) lst;
我有一个列表并返回每个数字的平方列表,但我无法弄清楚添加部分。
【问题讨论】:
sum,将列表的元素相加而不求平方。将其应用于您的平方列表。
您可以一次解决一个子问题并组合结果:
val sq = map (fn x => x*x)
val sum = foldl (fn (x, result) => x + result) 0
val sqsum = sum o sq
或者您可以将map 和foldl 融合在一起:
val sqsum = foldl (fn (x, result) => x*x + result) 0
或者您可以使用递归定义编写此函数:
fun sqsum (x::xs) = x*x + sqsum xs
| sqsum [] = 0
并最终将其改进为尾递归:
fun sqsum L =
let fun f (x::xs) result = f xs (x*x + result)
| f [] result = result
in f L 0 end
尽管像 map 和 foldl 这样的高阶列表组合器非常有用,并且一旦你习惯了它们就可以提高代码的可读性,但使用手动递归解决介绍性练习对学习过程非常有价值;毕竟map 和foldl 就是这样构建的。
【讨论】: