2012-10-10 43 views
1

En OCaml comment j'écrirais une fonction médiane qui prend 5 arguments et renvoie la médiane. Par exemple med5 2 5 7 4 3 renverrait .Fonction qui renvoie la médiane? (OCaml)

j'ai réussi à écrire une fonction MED3 (retourne la médiane des 3 arguments) en utilisant si et déclarations d'autre mais ce serait ridiculement complexe si je tentais la même technique pour 5 arguments :(

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;; 

Pour la med5 Je voudrais pouvoir utiliser les fonctions min et max (intégrées à OCaml) pour supprimer les valeurs les plus hautes et les plus basses de l'ensemble des 5 arguments, puis utiliser la fonction med3 que j'ai déjà écrite pour renvoyer la médiane des 3 arguments restants, mais comment rejeter les arguments minimum et maximum!?!?!?!?

Toute aide serait très appréciée :)

+0

à moins que je ne me trompe pas, 'med5 2 5 7 4 3' est' '4' et non 3' – Virgile

+0

Haha, votre droit tout à fait, merci pour cette remarque :) – brnby

Répondre

2

Si vous pouvez utiliser Array, il suffit de mettre vos 5 entrées dans un tableau, de le trier et de retourner a[2]. S'il est également interdit dans votre mission, vous pouvez utiliser un de type pauvre homme bulle pour sélectionner le maximum, le min:

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 
0

Vous pouvez mettre ces 5 arguments dans une liste, puis supprimer un élément d'une liste est facile.

+0

Malheureusement, mon question faisait partie d'une affectation qui spécifiait que nous ne pouvions pas utiliser les listes parce que nous n'étions pas censés avoir encore appris à leur sujet :(Pas que je saurais écrire la fonction en utilisant listes soit !!! : '( – brnby

+0

Je devrais également mentionner que la date limite pour cette cession est déjà passée. – brnby

0

Si les listes et les tableaux sont interdits, vous pouvez avoir trois variables stockant les trois plus grands éléments parmi les cinq:

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 
Questions connexes