在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个参数的中位数,但是如何丢弃最小和最大参数!?!?!?!?
非常感谢任何帮助:)
答案 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