0

需要一些关于 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...   

我在正确的道路上吗?

4

2 回答 2

0

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

以接近最少数量的比较来解决这个问题似乎相当困难。5 个数字有 120 种不同的顺序,您需要跟踪其中相当大的一部分。

为了减少可能性的数量,您可以对所有数字进行排序并取中间的一个。或者你可以对一些数字组进行排序并从那里开始工作。

这是一些代码,通过对其中两个进行排序然后找出第三个在哪里来计算 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
于 2013-10-23T04:03:40.617 回答
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 的编程笔记。)

于 2013-10-23T04:50:33.763 回答