需要找到中位数

时间:2013-10-23 01:27:45

标签: functional-programming ocaml

需要一些关于OCaml的建议并找到五个参数的中位数(我是这个语言的完全初学者)

到目前为止我已经

let med5 x1 x2 x3 x4 x5 = if x1<=x2 then x1,x2 else x2,x1; if x2<=x3 then x2,x3 else x3,x2...   

我是在正确的道路上吗?

2 个答案:

答案 0 :(得分:0)

一般来说,这段代码似乎在正确的轨道上。但是,您的代码返回一对数字。最终你会希望代码返回一个数字。

通过接近最小数量的比较来解决这个问题似乎相当困难。有120个不同的5个数字的订单,你需要跟踪它们中相当大的一部分。

为了保持较小的可能性,您可以对所有数字进行排序,然后选择中间数字。或者你可以对某些数字组进行排序并从那里开始工作。

这里有一些代码通过对其中两个数字进行排序然后确定第三个数字的位置来计算3个数字的中位数。

let med3 a b c =
    let (l, h) = if a < b then (a, b) else (b, a) in
    if c < l then l else if c > h then h else c

答案 1 :(得分:0)

找出前三个元素的顺序,然后调用一个使用该排序信息来完成工作的函数:

let min3 a b c = min (min a b) c
let max3 a b c = max (max a b) c

(* First three arguments in order *)
let median5_3 a b c d e =
  assert (a <= b && b <= c);
  if d < b then
    if e < b then max3 a d e else b
  else
    if e < b then b else min3 c d e

let median5 a b c d e =
  if a < b then
    if a < c then
      if b < c then median5_3 a b c d e
      else median5_3 a c b d e
    else median5_3 c a b d e
  else
    if b < c then
      if a < c then median5_3 b a c d e
      else median5_3 b c a d e
    else median5_3 c b a d e

(顺便说一句,这是Stepanov的编程注释。)