2

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

1 に答える 1

4

パターンに現れる識別子は常に一致し、対応する値を識別子にバインドします。識別子の現在の値はまったく問題ではありません。パターンは新しいバインディングを引き起こします。つまり、識別子に新しい値を与えます (マッチのすぐ内側)。

# let a = 3;;
val a : int = 3
# match 5 with a -> a;;
- : int = 5
# a;;
- : int = 3
#

したがって、あなたの match ステートメントは、あなたが思っていることをしていません。おそらくif、コードのその部分に を使用する必要があります。

アップデート

連想リストを使用してf、フォローアップの質問で関数を近似する方法は次のとおりです。

let f x = List.assoc x [(pat1, ans1); (pat2, ans2)]

がまたはと等しくない場合、Not_found例外が発生します。xpat1pat2

(あなたの Python コードが欠落していると思いますreturn。)

于 2013-02-16T23:54:42.973 に答える