Je dois écrire un programme qui donne une sortie un tuple avec: min et max d'une liste non vide et la valeur qui apparaît le plus souvent. En particulier:
let rec max_list xs = match xs with | [] -> failwith "xs" "Empty list" | [x] -> x | x1::x2::xs' -> max_list((max2 x1 x2)::xs');;
3 Réponses :
let mode xs = xs |> List.groupBy id |> List.map (fun (i, is) -> i, Seq.length is) |> List.maxBy snd |> fst
Pourquoi ne pas utiliser de maxby immédiatement, sans carte? (List.Maxby (Fun (_, X) -> Seq.Length X))
@FoggyFinder aucune raison particulière :)
Parce que je ne peux utiliser aucune fonction en dehors de ce qui a été expliqué par le professeur: Et c'est mon problème quand je dois faire des exercices, car aussi dans ce cas, j'ai immédiatement pensé à Lis.map, list.fold, Seq.fut etc.
@Simonecalliari Normalement, l'exercice consiste à passer d'une implémentation récursive pour utiliser un pli, mais vous devriez pouvoir aller aussi bien.
Je vais prendre la première suggestion de @Mark semble répondre à la réponse et courez avec elle, afin de le rendre générique, de travailler avec n'importe quel type de collecte et de gérer le cas de la collection vide sensiblement. let mostFrequent xs =
xs
|> Seq.countBy id
|> Seq.maxBy snd
|> fst
[1;0;-1;2;0;-4]
|> mostFrequent
// val it : int = 0
option sans l'utilisation de modules standard: dotnetfiddle p> sur la deuxième question - montrez leurs tentatives de résoudre. p> p>
Comme une note latérale; votre
max_list code> semble un peu compliqué pour son objectif; Pourrait être plus simple de passer autour du maximum actuel avec le reste de la liste et de la mettre à jour si la tête actuelle est supérieure. ou sans passer autour; Il suffit de retourner le max entre la tête actuelle et la max_list de la queue