Visual studio 列表中元组第二个元素的平均值

Visual studio 列表中元组第二个元素的平均值,visual-studio,recursion,f#,pattern-matching,tuples,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 -> ( f

我是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 )

如果我只做算术,它就行了。但当我将计算平均年龄所需的除法计算在内时,结果并不正确。在这个例子中,平均值应该是1(平均年龄不是所有数字的平均值),但它给了我1.83333。我做错了什么?我猜浮点除法有问题。任何见解都会有所帮助

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

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

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

@帕斯卡尔贝茨:哎呀,对不起。同时学习多种语言当然不是一个好主意。编辑我的帖子。感谢您指出。您在每次迭代中都会除以列表大小,而不是在最后一次。@FyodorSoikin感谢您为我指出了正确的方向。
[ ("A", 2015); ("B", 2015); ("C", 2015) ]
|> List.averageBy (fun (_, year) -> float (2016 - year))