Les Allergies
Alimentaires
Posez votre question Signaler

Tri liste Ocaml

yaldoo - Dernière réponse le 23 nov. 2011 à 16:14
Bonjour,
je viens de commencer a utiliser Ocaml et je n'arrive pas a bien cerner les fonctions récursives.habitué au C la récursivité en Ocaml est je trouve assez difficile à comprendre lorceque l'on débute.Bref voici mon problème :
je souhaite faire une fonction qui insert un élément dans une liste déja triée.
insert [10;20;30;50;60] 40 devrait retourner [10;20;30;40;50;60]
voici mon code :
let rec insert l a = match l with
  |[]->[]
  |tete::queue -> if(a<=tete) then a::queue else tete::(insert queue a);;

et voici le resultat :
insert[10;20;30;50;60;70;80] 40 ;;
-: int list = [10; 20; 30; 40; 60; 70; 80]
je vois bien le problème mais je ne vois pas la solution pour réaliser une étape supplémentaire qui permettrait de gérer l'élément 50 de ma liste
Si vous avez des sites qui proposent des exercices sur les listes avec ou sans correction je suis preneur.
Merci
Lire la suite 

Tri liste Ocaml »

4 réponses
Réponse
+1
moins plus
Des sites sur Caml j'avoue que je n'en connais pas beaucoup.
Le Site du Zéro a un tutoriel mais je ne sais pas s'il est fini. Il y a bien sûr la doc de l'INRIA mais ce n'est pas très pédagogique... Tente une recherche Google pour trouver des TD de programmation fonctionnelle niveau master. Tu trouveras des exercices et peut-être les corrections (y a plus qu'à filtrer pour trouver ceux sur les listes).

Ici ton problème est assez facile à corriger. Lorsque tu as (a<=tete) tu renvoie a et queue, mais du coup tu perds la tête (avec et sans jeu de mots ^^)
Ce que tu peux faire c'est donc if(a<=tete) then a::l et ça résout ton problème ;-)
yaldoo - 23 nov. 2011 à 12:49
ah merci pour cette réponse rapide.Entre la tête et la queue on s'y perd facilement lol.Merci pour ton aide ...
Ajouter un commentaire
Réponse
+0
moins plus
par contre cette fonction ne matche pas si le paramètre entré est plus grand que tous les entiers de la liste
exemple:
insert[1;2;3] 5 ne marche pas.
des idées?
KX- 23 nov. 2011 à 16:14
Là c'est un autre bug, indépendant, ce coup-ci c'est lorsque la liste l est vide, il ne faut pas renvoyer une liste vide mais la liste qui contient a... |[]->[a]

Je résume :

let rec insert l a =  
    match l with  
     []->[a]  
    |tete::queue -> if(a<=tete)  
                    then a::l  
                    else tete::(insert queue a);;

Cependant cette écriture n'est pas vraiment belle pour les puristes, parce qu'on préférera utiliser au maximum le pattern matching qui est plus puissant que la condition if.
De plus il est plus intéressant de faire apparaître le lambda-calcul vu qu'on fait de la programmation fonctionnelle, ce qui t'oblige à passer la liste en deuxième argument...

let rec insert a = function  
     []->[a]  
    |tete::queue when a>tete -> tete::(insert a queue)  
    |l  -> a::l;;
Ajouter un commentaire
Ce document intitulé « tri liste Ocaml » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?