我是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。我究竟做错了什么?我猜浮点除法有些不对劲。任何见解都会有所帮助
答案 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))