2016-09-16 158 views
2

我是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。我究竟做错了什么?我猜float分区有问题。任何见解都会有帮助。

+1

这不是红宝石。 –

+0

@pascalbetz哎呀,对不起。同时学习多种语言当然不是一个好主意。编辑我的帖子。感谢您指出。 –

+2

您在每次迭代时都按列表大小进行划分,而不是在最后一次。 –

回答

4

listSize被乘以到结果上的递归函数每次迭代,使得迭代总结于:1/3 + 1/2 + 1 = 1.8333(...)

要转换整数在元组中浮动并得到平均值,可以使用List.averageBy

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

完美!谢谢。 –

相关问题