Tri à bulles en caml
Résolu
Sara426
Messages postés
782
Statut
Membre
-
Sara426 Messages postés 782 Statut Membre -
Sara426 Messages postés 782 Statut Membre -
Bonjour,
Je suis en première année de licence d'informatique et on a un projet à faire sur caml.
Il faut faire plusieurs fonctions de tri et voir laquelle est la plus rapide.
Je suis bloquer à la fonction de tri à bulles.
Le principe est de prendre le premier élément de la liste l et de le comparé au deuxième pour savoir s'il est plus petit ou plus grand. S'il est plus petit, il reste en tête ; s'il est plus grand, on continue avec le deuxième élément de la liste jusqu'à trouvé un élément plus grand que lui.
On fait ça pour tout les éléments de la liste, et une fois arrivé à la fin, on obtient une liste triée.
Voilà ce que j'ai tapé :
let rec tri_bulle_bis f l a =
match (l,a) with
([],_) -> a
|(_,[]) -> tri_bulle_bis f (List.tl l) (List.hd l)
|(x::r,y::s)-> if (f x y)
then tri_bulle_bis f r (x::s)
else tri_bulle_bis f r (y::(tri_bulle_bis f [x] s)) ;;
let tri_bulle f l =
tri_bulle_bis f l [] ;;
Seulement caml me renvoie une erreur :
This expression has type 'a list
but an expression was expected of type 'a
Et je n'arrive pas à trouvé l'erreur.
Est-ce que quelqu'un peut m'aider ?
Merci d'avance pour vos réponses.
Sara.
Je suis en première année de licence d'informatique et on a un projet à faire sur caml.
Il faut faire plusieurs fonctions de tri et voir laquelle est la plus rapide.
Je suis bloquer à la fonction de tri à bulles.
Le principe est de prendre le premier élément de la liste l et de le comparé au deuxième pour savoir s'il est plus petit ou plus grand. S'il est plus petit, il reste en tête ; s'il est plus grand, on continue avec le deuxième élément de la liste jusqu'à trouvé un élément plus grand que lui.
On fait ça pour tout les éléments de la liste, et une fois arrivé à la fin, on obtient une liste triée.
Voilà ce que j'ai tapé :
let rec tri_bulle_bis f l a =
match (l,a) with
([],_) -> a
|(_,[]) -> tri_bulle_bis f (List.tl l) (List.hd l)
|(x::r,y::s)-> if (f x y)
then tri_bulle_bis f r (x::s)
else tri_bulle_bis f r (y::(tri_bulle_bis f [x] s)) ;;
let tri_bulle f l =
tri_bulle_bis f l [] ;;
Seulement caml me renvoie une erreur :
This expression has type 'a list
but an expression was expected of type 'a
Et je n'arrive pas à trouvé l'erreur.
Est-ce que quelqu'un peut m'aider ?
Merci d'avance pour vos réponses.
Sara.
A voir également:
- Tri à bulles en caml
- Comment faire un tri personnalisé sur excel - Guide
- Logiciel tri photo - Guide
- Ajoutez à la liste de contacts ana le goff, inscrite le 27 novembre 2015, dans la catégorie i. puis triez les contacts en les classant : par ordre alphabétique de leur nom de famille (critère principal), puis par date du plus récent au plus ancien (critère secondaire). quel mot apparaît à la verticale dans la colonne "catégorie" entre les lignes 200 et 209 (en-tête compris) ? ✓ - Forum Word
- En cours de traitement sur le site de tri local - Forum Consommation & Internet
- Comment mettre des bulles sur des photos - Forum Graphisme
3 réponses
Lorsque tu fais tri_bulle_bis f (List.tl l) (List.hd l), l'élément (List.hd l) n'est pas une liste mais un élément de liste. Ecris le [List.hd l] ça devrait mieux marcher...
Exact ca a marché. Merci beaucoup
Mais j'ai un autre problème maintenant. Il oublie certains éléments de la liste.
# tri_bulle (<) [5;6;7;1;2;9] ;;
- : int list = [1; 2; 7; 9]
Mais j'ai un autre problème maintenant. Il oublie certains éléments de la liste.
# tri_bulle (<) [5;6;7;1;2;9] ;;
- : int list = [1; 2; 7; 9]
Je te conseilles d'utiliser #trace pour débugger, et éventuellement consulter cet article : Déboguer un programme en Caml pour voir comment bien s'en servir avec des fonctions polymorphes...