需要一些关于 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...
我在正确的道路上吗?
需要一些关于 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...
我在正确的道路上吗?
一般来说,这段代码似乎在正确的轨道上。但是,您的代码返回一对数字。最终,您会希望代码返回一个数字。
以接近最少数量的比较来解决这个问题似乎相当困难。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
找出前三个元素的顺序,然后调用一个使用该排序信息完成工作的函数:
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 的编程笔记。)