Tri à bulles en caml

Résolu/Fermé
Sara426 Messages postés 678 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 16 décembre 2015 - 16 avril 2011 à 15:38
Sara426 Messages postés 678 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 16 décembre 2015 - 16 avril 2011 à 22:40
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.

3 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 avril 2011 à 17:37
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...
0
Sara426 Messages postés 678 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 16 décembre 2015 63
16 avril 2011 à 17:56
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]
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 avril 2011 à 18:20
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...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 16/04/2011 à 18:36
Remarque : il suffit dans ton cas d'imposer temporairement f pour avoir un #trace compréhensible

let rec tri_bulle_bis (f:int->int->bool) l a = ... ;;
#trace tri_bulle_bis;;
0
Sara426 Messages postés 678 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 16 décembre 2015 63
16 avril 2011 à 22:40
Merci c'est bon, j'ai trouvé.
Juste une erreur de lettre entre le a et le s dans le if-then-else.

Merci pour ta fonction trace c'est super pratique.
:D
0