【问题标题】:How can I compare the average of a list with every element in the same list?如何将列表的平均值与同一列表中的每个元素进行比较?
【发布时间】:2019-07-23 02:57:26
【问题描述】:
fun promedio l = let
    fun sl(nil, sum, len) = sum div len
    |  sl(h::t, sum, len) = sl(t, sum + h, len + 1)
in 
 sl(l, 0, 0)
end;

这段代码给了我一个列表的平均值,但现在我必须将该列表中的每个元素与平均值进行比较,并说明有多少元素大于平均值,多少元素低于平均值。

您能帮我完成最后一步吗?

【问题讨论】:

    标签: functional-programming sml


    【解决方案1】:

    您的promedio 函数在空输入时失败; promedio [],因为它试图除以零。

    这里有两种考虑空列表的替代方法:

    (* Using one traversal *)
    fun average xs =
        case foldl (fn (x, (sum, count)) => (x + sum, 1 + count)) (0, 0) xs of
             (0, 0) => 0
           | (x, y) => x div y
    
    (* Using two traversals *)
    val sum = foldl op+ 0
    fun average [] = 0
      | average xs = (sum xs) div (length xs)
    

    您可以使用任何带有List.partition 的谓词对列表进行分区

    在您的情况下,谓词可能是x <= avg

    fun partition_average xs =
        let val avg = average xs
        in List.partition (fn x => x <= avg) xs end
    

    请注意,如果我没有在fn x =&gt; ... 之外将average xs 绑定到avg

    (* Don't do this *)
    fun partition_average xs =
        List.partition (fn x => x <= average xs) xs
    

    然后我将为xs 的每个元素重新计算average xs

    一个演示:

    - partition_average [1,2,3,4,5]; (* avg being 3 *)
    > val it = ([1, 2, 3], [4, 5]) : int list * int list
    
    - partition_average [1,2,3,9]; (* avg being 3(.75) *)
    > val it = ([1, 2, 3], [9]) : int list * int list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-19
      • 2015-04-02
      • 2013-06-06
      • 1970-01-01
      • 2017-10-30
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多