IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Exercice sur les graphes et listes.


Sujet :

Caml

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Exercice sur les graphes et listes.
    Bonjour,

    J'ai un petit exercice que je n'arrive pas a résoudre. Je dois représenter des graphes afin de réaliser différents algorithmes de coloration.

    Voici ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type couleur = 
        | Vierge
        | Couleur of int;;
     
    type sommet = 
        {id : int;
         mutable couleur : couleur;
         mutable voisins : sommet list};;
     
    type graphe = sommet list;;
    Je souhaiterais construire une liste des sommets de mon graphe par dégré décroissant.

    Pour cela j'ai la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec listeSommet l = match l with 
    |[] -> [] 
    |[t::q] -> (t.id,degre_sommet t)::(listeSommet q);;
    La fonction "degre_sommet" fonctionne et retourne bien le degré du sommet.


    Mon probleme est que ma fonction listeSommet ne fonctionne pas et me retourne : "This expression has type sommet list but is here used with type
    sommet list list
    "


    En espérant trouver un peu d'aide,

    Clément.

  2. #2
    Membre actif
    Avatar de Ptival
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 70
    Points : 276
    Points
    276
    Par défaut
    Citation Envoyé par clement1010 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec listeSommet l = match l with 
    |[] -> [] 
    |[t::q] -> (t.id,degre_sommet t)::(listeSommet q);;
    Ton second motif ici correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [t::q]
    ^    ^ une liste contenant un unique élément
      ^^ cet élément est une liste
     ^ dont la tête sera référée via le nom t
        ^ et la queue sera référée via le nom q
    (* Grrr! Pourquoi la balise code n'affiche pas en monospace ? >:( *)
    Le motif que tu souhaites est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec listeSommet l = match l with 
    |[] -> [] 
    |t::q -> (t.id,degre_sommet t)::(listeSommet q);;
    C'est à dire une liste dont la tête s'appellera t et la queue s'appellera q.


  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup, j'ai compris mon erreur.

    Merci pour ton explication claire et rapide !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Je voudrais maintenant trier ma liste par ordre de degré décroissant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let rec listeSommetDecroissant l = match l with
    |[] -> [] 
     
    |(s1,d1)::[] -> [(s1,d1)]
     
    |t::(s1,d1)::(s2,d2)::[] -> if d2 > d1 
    then t::(s2,d2)::(s1,d1)::[] 
    else t::(s1,d1)::(s2,d2)::[]
     
    |t::(s1,d1)::(s2,d2)::q -> if d2 > d1 
    then (listeSommetDecroissant (t::(s2,d2)::(s1,d1)::q)) 
    else (listeSommetDecroissant ((s1,d1)::(s2,d2)::q));;

    Le problème est que lorsque j'arrive a mes deux derniers couple (cas n°3 du 'with') je n'arrive pas a conserver l'intégralité de ma liste triée précédemment, mais uniquement le précédent..

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let listeSommetDecroissant =
       let pair_compare a b = compare (snd b) (snd a) in
       List.sort pair_compare
    ;;
    Pourquoi réinventer la roue ?
    -- Yankel Scialom

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Je ne comprends pas tellement ta réponse...

    Voici ce que me rend ma fonction listeSommet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # listeSommet gtest;;
    - : (int * int) list = [1, 1; 2, 1; 3, 3; 4, 2; 5, 2; 6, 3; 7, 1; 8, 1]
    Il s'agit d'une liste de couples (numero sommet,degré sommet).

    Je voudrais simplement trier cette liste par degré décroissant.

  7. #7
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Tu as du mal recopier ma proposition. Quant à son fonctionnement, je te renvoie vers la documentation de la fonction List.sort.

    Cdlt,
    -- Yankel Scialom

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Merci, je ne comprenais pas la signification de snd. Maintenant j'ai réussi. Je clos le topic.

    Merci à vous deux.

  9. #9
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Super, maintenant que tu as lu la doc, n'hésite pas à poser des questions . Et pense à ce joli bouton qui s'ennuie dans son coin.
    -- Yankel Scialom

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exercice sur les listes
    Par reuqnas dans le forum Caml
    Réponses: 2
    Dernier message: 06/12/2011, 20h25
  2. projet ou exercices sur les listes chainées
    Par petite_developpeuse dans le forum C
    Réponses: 1
    Dernier message: 12/12/2008, 17h07
  3. Réponses: 2
    Dernier message: 24/04/2006, 16h21
  4. Besoin d'aide pour un exercice sur les registres
    Par zakuza dans le forum Assembleur
    Réponses: 5
    Dernier message: 14/04/2006, 14h23
  5. Réponses: 4
    Dernier message: 28/07/2005, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo