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 :

fonction sans double


Sujet :

Caml

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 27
    Points : 11
    Points
    11
    Par défaut fonction sans double
    Bonjour je dois faire cette fonction :

    Ecrivez une fonction de profil
    sans double : ’a list -> ’a list
    qui, étant donné une liste, retourne la liste des valeurs présentes dans l’argument en supprimant les occurences multiples.
    Exemple :
    sans double [1 ; 2 ; 1 ; 3 ; 3 ; 1] ; ;
    : - [2 ; 3 ; 1]

    J'ai fait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #let rec sans_double list = match list with
    []->[]
      |t::q->if t= then sans_double q else  t::sans_double q
    Pouvez vous m'aider car je n'arrive pas à finaliser la fonction. Merci beaucoup

  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
    Il y a plusieurs façon de faire cela plus efficacement, mais pour un début, commence par réfléchir à ce que veut dire "sans double". Cela signifie que dès que tu as rencontré un élément, tu veux le supprimer du reste la liste avant de recommencer le processus avec les éléments qui restent, non ? Ajoute à ça la fonction List.filter qui te permet de ne garder que les éléments de la liste qui correspondent à un certain critère...

    --
    Jedaï

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Je n'ai jamais vu en cours List.filter

  4. #4
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Plus simplement : pour une liste t :: q, si t fait partie de la liste des valeurs déjà construite, alors il ne faut pas le mettre, sinon, il faut le mettre... facile, non ?

    Tu auras besoin d'une fonction intermédiaire. La façon la plus simple est de procéder par accumulation.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Avril 2007
    Messages : 31
    Points : 29
    Points
    29
    Par défaut Idée de solution
    Une liste l est vide (la forme en est []) ou pas vide (la forme en est alors hd::tl).

    Le résultat de sans_double peut être défini pour ces deux cas:
    • liste vide (l = []): le résultat est la liste vide
    • liste pas vide (l = hd::tl): suppose que tu as déjà calculé le résultat de (sans_double tl). Appelle tl' ce résultat: il n'y a, par hypothèse de récurrence, aucun doublon dans tl'. Il y a deux possibilités. La première est que hd est présent dans tl'; en ce cas le résultat est tl'. La seconde est que hd n'est pas présent dans tl'; et en ce cas, le résultat est hd::tl'.

    Que manque-t-il maintenant pour construire ta solution? Une fonction qui teste si une valeur v est présente dans une liste l.

    Tu peux appliquer un raisonnement similaire pour ce second problème.
    • liste vide (l = []): Le résultat est "faux".
    • liste pas vide (l = hd::tl): Si v est égal à hd, alors le résultat est "vrai". Sinon, v appartient à l si, et seulement si, v appartient à tl.


    Je pense avoir détaillé, autant que possible, les éléments d'une solution possible à ton problème. J'espère que cela te sera utile!

    David.
    --
    Citation Envoyé par alix30002000 Voir le message
    Bonjour je dois faire cette fonction :

    Ecrivez une fonction de profil
    sans double : ’a list -> ’a list
    qui, étant donné une liste, retourne la liste des valeurs présentes dans l’argument en supprimant les occurences multiples.
    Exemple :
    sans double [1 ; 2 ; 1 ; 3 ; 3 ; 1] ; ;
    : - [2 ; 3 ; 1]

    J'ai fait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #let rec sans_double list = match list with
    []->[]
      |t::q->if t= then sans_double q else  t::sans_double q
    Pouvez vous m'aider car je n'arrive pas à finaliser la fonction. Merci beaucoup

Discussions similaires

  1. Appeler juste une fonction sans include
    Par laurent_ifips dans le forum Langage
    Réponses: 5
    Dernier message: 22/11/2005, 23h08
  2. Signature d'une fonction sans argument
    Par cj227854 dans le forum C++
    Réponses: 5
    Dernier message: 20/10/2005, 17h01
  3. [LG] Compilation de fonction 'sans retour', ...
    Par poppels dans le forum Langage
    Réponses: 5
    Dernier message: 16/10/2005, 12h08
  4. lancer fonction sans trigger
    Par $grm$ dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/04/2005, 10h58
  5. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32

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