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

Lisp Discussion :

Fonction récursive association listes


Sujet :

Lisp

  1. #1
    Candidat au Club
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Fonction récursive association listes
    Bonsoir.
    Je débute en LISP et je dois dire que la syntaxe me déroute beaucoup.
    J'essaye de réaliser cet exercice mais je ne vois pas comment commencer. Dans un autre langage je n'aurais aucun problème, mais là...

    1. À partir d'une liste associant des titres de films et leurs réalisateurs (certains réalisateurs ont fait
    plusieurs films) et d'une liste des budgets correspondants en euros :
    ListeA : ((film1 réalisateur1) ... (filmN réalisateurM))
    ListeB : (budget1 ... budgetN)
    Faire une fonction récursive qui associe le budget au film :
    (associe ListeA ListeB) => ((film1 réalisateur1 budget1) ... (filmN réalisateurM budgetN))

    Cordialement.

  2. #2
    Candidat au Club
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon he bien c'est réussi, je me suis précipité pour poster. Je poste ici ma réponse, elle servira surement.
    (setq listea '((film1 realisateur1) (film2 realisateur1) (film3 realisateur2)))
    (setq listeb '(budget1 budget2 budget3))
    (defun associe (listea listeb)
    (cond
    ((atom listea) nil)
    ((cons (cons (car listeb) (car listea)) (associe (cdr listea) (cdr listeb)))) ) )

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Ça marche.

    Il est d’usage d’introduire la dernière branche de COND avec T:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (cond ((atom listea) nil)
          (t (cons (cons (car listeb) (car listea))
                   (associe (cdr listea) (cdr listeb)))))
    D’ailleurs, comme il n’y a que deux branches, il vaut mieux employer IF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (if (atom listea)
        '()
        (cons (cons (car listeb) (car listea))
              (associe (cdr listea) (cdr listeb))))
    Ici j’ai décidé d’employer la notation '() pour désigner la liste vide.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Si tu as besoin des variables globales, il faut les déclarer à l’aide de DEFVAR ou DEFPARAMETER. D’habitude, on utilise des cache-oreilles pour les distinguer des variables locales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (defvar *listea* '((film1 realisateur1) (film2 realisateur1) (film3 realisateur2)))
    (defvar *listeb* '(budget1 budget2 budget3))
    SETQ est un opérateur d’affectation qui change la valeur d’une variable déjà existante. De nos jours, il vaut mieux, peut-être, l’éviter en utilisant SETF. (Dans notre cas, on n’a besoin ni de l’un, ni de l’autre.)

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ceriums Voir le message
    Bon he bien c'est réussi, je me suis précipité pour poster. Je poste ici ma réponse, elle servira surement.
    Bonjour et bravo pour ce bon début!

    Tu peux modifier ta réponse et, si tu me permets de te vouvoyer, en cliquant sur le petit "#" de la barre d'outils.

    Je n'ai pas testé ton code mais, à première vue, mon détecteur de bugs intégré me dit qu'il me semble que ta fonction va créer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (associe ListeA ListeB) => ((budget1 film1 réalisateur1) ... (budgetN filmN réalisateurN))
    et non, comme demandé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (associe ListeA ListeB) => ((film1 réalisateur1 budget1) ... (filmN réalisateurN budgetN))
    peut-être qu'en utilisant la fonction "append"...

    (vaudrait p'têt mieux éviter "nconc" si tu veux garder la liste originale en l'état )

  6. #6
    Candidat au Club
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Bonjour et bravo pour ce bon début!

    Tu peux modifier ta réponse et, si tu me permets de te vouvoyer, en cliquant sur le petit "#" de la barre d'outils.

    Je n'ai pas testé ton code mais, à première vue, mon détecteur de bugs intégré me dit qu'il me semble que ta fonction va créer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (associe ListeA ListeB) => ((budget1 film1 réalisateur1) ... (budgetN filmN réalisateurN))
    et non, comme demandé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (associe ListeA ListeB) => ((film1 réalisateur1 budget1) ... (filmN réalisateurN budgetN))
    peut-être qu'en utilisant la fonction "append"...

    (vaudrait p'têt mieux éviter "nconc" si tu veux garder la liste originale en l'état )
    Exact, j'ai fait ça car je ne me souvenais plus de la fonction append :-)
    Merci pour la précision. Et merci également à byjav pour les précisions.

Discussions similaires

  1. Fonction récursive trouver le max dans une liste.
    Par shirohige dans le forum Lisp
    Réponses: 17
    Dernier message: 17/09/2014, 19h54
  2. Liste déroulante - fonction js associée
    Par dream_of_australia dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 27/06/2007, 09h30
  3. Réponses: 7
    Dernier message: 22/06/2007, 10h56
  4. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54
  5. Equivalent de la fonction d'agregat LIST ?
    Par rahan15 dans le forum SQL
    Réponses: 5
    Dernier message: 10/12/2004, 22h21

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