列表

时间:2016-09-16 20:28:50

标签: visual-studio recursion f# pattern-matching tuples

我是F#的新手,很抱歉,如果这听起来太基本了。 我试图使用递归和模式匹配来计算元组列表的第二个元素的平均值,但它没有给我正确的结果。我的代码:

let rec getAverageAge (list: List<string*int>) =
      let listSize = float 1 / float list.Length
      match list with
        | [] -> 0.0
        | head :: tail -> ( float (2016 - snd head) * listSize  + getAverageAge tail )

我这样称呼它:

getAverageAge [("A",2015); ("B",2015); ("C",2015)]

如果我只做总和,它就有效。但是当我合并计算平均年龄所需的分工时,结果是不对的。就像在这种情况下,平均值应为1(平均年龄不是所有数字的平均值),但它给我1.83333。我究竟做错了什么?我猜浮点除法有些不对劲。任何见解都会有所帮助

1 个答案:

答案 0 :(得分:4)

listSize在递归函数的每次迭代中被乘以结果,因此迭代总和为:1/3 + 1/2 + 1 = 1.8333(...)

要将元组中的整数转换为浮点数并获得平均值,可以使用List.averageBy

[ ("A", 2015); ("B", 2015); ("C", 2015) ]
|> List.averageBy (fun (_, year) -> float (2016 - year))