返回中位数的函数? (OCaml的)

时间:2012-10-10 11:17:40

标签: ocaml median

在OCaml中,我如何编写一个带有5个参数并返回中位数的中值函数。例如,med5 2 5 7 4 3将返回 4

我设法使用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个参数的中位数,但是如何丢弃最小和最大参数!?!?!?!?

非常感谢任何帮助:)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以将这5个参数放入列表中,然后从列表中删除元素很容易。

答案 2 :(得分:0)

如果禁止列表和数组,则可以有三个变量存储五个中最大的三个元素:

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