【问题标题】:Square numbers in list and then add them up列表中的平方数,然后将它们相加
【发布时间】:2018-03-22 17:26:20
【问题描述】:

我正在尝试创建一个对 ML 列表的数字求平方然后将这些数字相加的函数

fun sqsum(lst) = map (fn x => x*x) lst;

我有一个列表并返回每个数字的平方列表,但我无法弄清楚添加部分。

【问题讨论】:

  • 编写一个函数sum,将列表的元素相加而不求平方。将其应用于您的平方列表。

标签: sml ml


【解决方案1】:

您可以一次解决一个子问题并组合结果:

val sq = map (fn x => x*x)
val sum = foldl (fn (x, result) => x + result) 0
val sqsum = sum o sq

或者您可以将mapfoldl 融合在一起:

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

尽管像 mapfoldl 这样的高阶列表组合器非常有用,并且一旦你习惯了它们就可以提高代码的可读性,但使用手动递归解决介绍性练习对学习过程非常有价值;毕竟mapfoldl 就是这样构建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多