2016-09-16 160 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

完美!謝謝。 –

相關問題