リストの中央値を見つけることができるコードを書いていますが、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)