1

OCamlで、5つの引数を取り、中央値を返す中央値関数をどのように記述しますか。たとえば、4med5 2 5 7 4 3を返します。

ifおよびelseステートメントを使用してmed3関数(3つの引数の中央値を返す)を作成することができましたが、5つの引数に対して同じ手法を試みた場合、これは途方もなく複雑になります:(

let med3 a b c =
  if ((b<=a && c>=a) || (c<=a && b>=a)) then a 
  else if ((a<=b && c>=b) || (c<=b && a>=b)) then b else c;;

med5関数の場合、min関数とmax関数(OCamlに組み込まれている)を使用して、5つの引数のセットから最高値と最低値を破棄できるようにしたいと思います。次に、すでに作成したmed3関数を使用して、残りの3つの引数の中央値を返すことができますが、最小引数と最大引数を破棄するにはどうすればよいですか!?!?!?!?

どんな助けでも大歓迎です:)

4

3 に答える 3

2

を使用できる場合はArray、5つのエントリを配列に入れて並べ替え、を返しa[2]ます。割り当てでも禁止されている場合は、貧乏人のバブルソートを使用して最大値を選択し、次に最小値を選択できます。

let med5 a b c d e =
  (* move the max towards 'e' *)
  let a,b = if a<=b then a,b else b,a in
  let b,c = if b<=c then b,c else c,b in
  ...
  (* then move the min towards 'd', don't forget to reverse the comparisons *)
  ...
  in med3 a b c
于 2012-10-10T12:08:19.460 に答える
0

これらの5つの引数をリストに入れると、リストから要素を簡単に削除できます。

于 2012-10-10T11:36:31.460 に答える
0

リストと配列が禁止されている場合、5つの中で最も大きい3つの要素を格納する3つの変数を持つことができます。

let med5 a b c d e =
    let first  = ref min_int in
    let second = ref min_int in
    let third  = ref min_int in

    if      a >= !first  then (third := !second; second := !first; first := a)
    else if a >= !second then (third := !second; second := a)
    else if a >= !third  then (third := a);

    if      b >= !first  then (third := !second; second := !first; first := b)
    else if b >= !second then (third := !second; second := b)
    else if b >= !third  then (third := b);

    (* you guess what to do for c, d, e ;-) *)

    (* return the third largest element: *)
    !third
于 2012-10-10T12:28:11.957 に答える