我正在编写一个可以找到列表中位数的代码,我不能使用rec,应该使用List.fold_left/right。我编写了以下代码,它应该可以工作。
它找到列表的长度,如果是奇数(如 5),则将 len1、len2 设置为 2、3,如果是偶数(如 6),则将 len1、len2 设置为 2、3。
然后对于列表中的每个成员,我匹配小于它的那些元素的数量。
但是,以下模式匹配总是将数学 lessNum elmt 匹配到 len1 - 有人可以告诉我为什么会这样吗?
let median (lst : int list) : float option =
let len = List.length lst in
if lst = [] then None
else
let len1, len2 = (len - 1) / 2, (len + 1) / 2 in
let lessNum a =
List.length (List.find_all (fun n -> n < a) lst) in
let answer = List.fold_left (fun accm elmt ->
match (lessNum elmt) with
| len1 -> accm + elmt
| len2 -> failwith "len2"
| _ -> failwith "other"
) 0 lst in
if len mod 2 = 0
then Some ((float_of_int answer) /. 2.0)
else Some (float_of_int answer)