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

Haskell Discussion :

Les Arbres binaires


Sujet :

Haskell

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Points : 122
    Points
    122
    Par défaut Les Arbres binaires
    Salut, encore des soucis pour pondre du bon haskell !

    Je programme un arbre binaire, j'ai des erreurs, dont un "Syntax error in declaration (unexpected `}', possibly due to bad layout)" dont je n'arrive pas a me defaire (dans les deux dernieres fonctions).

    Que pensez vous de la definition des fonctions de base ?
    Voyez vous ou sont mes erreurs ?

    Merci beaucoup d'avance pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    -- Definition d'un arbre binaire
    data TreeMap b = Empty | Node Int b (TreeMap b) (TreeMap b)
     
    -- Types des fonctions :
    tmLookup :: TreeMap Int -> b -> Maybe b		-- rechercher la valeur associee a une cle passee en parametre
    tmInsert :: TreeMap b -> Int -> b -> TreeMap b	-- ajouter une entree dans la table
    tmRemove :: TreeMap b -> Int -> TreeMap b	-- enlever une entree dont la clef est passee en parametre
     
    -- Code
    tmLookup (Node k v left right) k'
    			| k' == k   = just v
    			| k' < k    = tmLookup (left) k'	-- recursion dans le sous arbre gauche
    			| otherwise = tmLookup (right) k'	-- recursion dans le sous arbre droit
     
    tmInsert Empty k' v' = Node k' v' Empty Empty			-- Si arbre (ou sous arbre) vide
    tmInsert (Node k v l r) k' v'
    			| k' == k   = Node k' v' l r
    			| k'<k      = Node k v (tmInsert l k' v')r
    			| otherwise = Node k v l (tmInsert r k' v')
     
    tmMerge :: TreeMap b -> TreeMap b -> TreeMap b
    tmMerge Empty t = t
    tmMerge (Node k v l r) t = Node k v l (tmMerge r t)
     
    tmRemove Empty_ = Empty
    tmRemove (Node k v l r) k'
    			| k'<k = Node k v (tmRemove l k') r
    			| k'>k = Node k v l (tmRemove r k')
    			| otherwise tmMerge l r

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Commençons par corriger les petites erreurs d'étourderie (genre tu as oublié un "=" après le otherwise dans la dernière garde de tmRemove, tu as mis "Empty_" au lieu de "Empty _", tu as utilisé "just" au lieu de "Just"...), on a ça :
    Code Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    -- Definition d'un arbre binaire
    data TreeMap b = Empty | Node Int b (TreeMap b) (TreeMap b)
     
    -- Types des fonctions :
    tmLookup :: TreeMap Int -> b -> Maybe b		-- rechercher la valeur associee a une cle passee en parametre
    tmInsert :: TreeMap b -> Int -> b -> TreeMap b	-- ajouter une entree dans la table
    tmRemove :: TreeMap b -> Int -> TreeMap b	-- enlever une entree dont la clef est passee en parametre
     
    -- Code
    tmLookup (Node k v left right) k'
    			| k' == k   = Just v
    			| k' < k    = tmLookup (left) k'	-- recursion dans le sous arbre gauche
    			| otherwise = tmLookup (right) k'	-- recursion dans le sous arbre droit
     
    tmInsert Empty k' v' = Node k' v' Empty Empty			-- Si arbre (ou sous arbre) vide
    tmInsert (Node k v l r) k' v'
    			| k' == k   = Node k' v' l r
    			| k'<k      = Node k v (tmInsert l k' v')r
    			| otherwise = Node k v l (tmInsert r k' v')
     
    tmMerge :: TreeMap b -> TreeMap b -> TreeMap b
    tmMerge Empty t = t
    tmMerge (Node k v l r) t = Node k v l (tmMerge r t)
     
    tmRemove Empty _ = Empty
    tmRemove (Node k v l r) k'
    			| k'<k = Node k v (tmRemove l k') r
    			| k'>k = Node k v l (tmRemove r k')
    			| otherwise = tmMerge l r

    Ensuite ce code a toujours des problèmes, en particulier, le type de tmLookup est faux et semble trahir une confusion sur ce qu'elle doit faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmLookup :: TreeMap Int -> b -> Maybe b
    je suggère que le type devrait plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmLookup :: TreeMap b -> Int -> Maybe b
    Comme l'inférence de type te le dirais si tu retirais la déclaration de type (le corps de la fonction apparait correct).

    Dernièrement la fonction tmMerge ne préserve pas la structure d'arbre de recherche que les autres fonctions utilisent, ce qui suggère qu'elle est erronée, ou plus exactement, qu'elle devrait être locale à tmRemove, et non une fonction du top-level (surtout si tu ne dis rien sur les propriétés nécessaires de l et r pour avoir un résultat correct).

    --
    Jedaï

Discussions similaires

  1. Cours sur les arbres binaires
    Par Fredo123456 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 09/10/2008, 16h45
  2. Questions diverses sur les Arbres binaires + insertion d'un fils
    Par beegees dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 18/03/2008, 01h21
  3. Demande sur les arbres binaire
    Par IDE dans le forum C++
    Réponses: 12
    Dernier message: 02/12/2007, 17h55
  4. Les arbres binaire en java
    Par vincem35 dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2007, 19h44
  5. Java et les arbres binaires
    Par Noutch dans le forum JBuilder
    Réponses: 1
    Dernier message: 17/08/2007, 14h25

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