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 :

Exercice Listes et sous-listes


Sujet :

Lisp

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Exercice Listes et sous-listes
    Bonjour!

    Alors voici l'énoncé de l'exercice:

    A. Définir une fonction qui construit, à partir d'une liste incluant des sous-listes, la liste des sous-listes commençant par un nombre ; exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (nombre '((2 d b) c (d) (4 f) (e g x) f)) => ((2 d b) (4 f))
    Astuce : utilisez la fonction numberp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (numberp 3) => t
    (numberp 'abd) => nil
    Et la fonction and :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (and a b) => nil; si l'un des deux atomes est nil
    (and a b) => t; si les deux atomes sont non nil
    Et n'oubliez pas de tester si on a affaire à une liste...
    fin énoncé

    Alors voila ce que j'ai écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun nombre (liste)
      (cond
      	((atom liste) nil)
      	((listp liste) ((numberp (car (car (liste))))) (cons (car liste) (nombre (cdr liste))))  
      	(t (nombre (cdr liste))) ) )

    problème 1: Ça me renvoie
    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
     You are in the top-level Read-Eval-Print loop.
    Help (abbreviated :h) = this list
    Use the usual editing capabilities.
    (quit) or (exit) leaves CLISP.
      ((atom liste) nil)
      You are in the top-level Read-Eval-Print loop.
    Help (abbreviated :h) = this list
    Use the usual editing capabilities.
    (quit) or (exit) leaves CLISP.
      ((listp liste) ((numberp (car (car (liste))))) (cons (car liste) (nombre (cdr liste))))  
      You are in the top-level Read-Eval-Print loop.
    Help (abbreviated :h) = this list
    Use the usual editing capabilities.
    (quit) or (exit) leaves CLISP.
      (t (nombre (cdr liste))) ) )
    Ça me renvoie ça alors que pas ici mais dans le terminal j'ai respecté le prety-print, c'est-à-dire j'ai mis à la ligne et indenté tout ce qui avait après le listp
    problème 2 :
    lorsque je teste ça ne marche pas et j'ai essayé de mettre equal devant le numberp et le listp

    Pour moi la logique serait:
    condition 1: si l'argument de nombre est une liste vide
    condition 2: si l'argument de nombre est une liste,
    puis que le premier élément du premier élément de la liste est un nombre, construit la liste avec ce premier élément puis récursivité sur le reste de l'argument liste
    condition 3: si on a ni la condition 1 ni la condition 2 on récursive sur le reste de l'argument liste

    Donc mon problème c'est que déjà dans la logique je ne vois pas ou je dois utilisé le and
    et est ce que le numberp je dois mettre equal ou je laisse comme ça, ça dit tout seul s'il renvoie t je passe à la suite ou il faut un opérateur devant?

    Du coup je change et je mets and devant le numberep sans trop savoir pourquoi puis ca me renvoit bien la fonction nombre
    Mais en testant ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *** - system::read-eval-print: variable nombre has no value
    Rentrées possibles:
    USE-VALUE      :R1      Input a value to be used instead of nombre.
    STORE-VALUE    :R2      Input a new value for nombre.
    ABORT          :R3      Abort main loop
    Merci pour votre aide!

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Pour aider à répondre à ta question, il faut que tu mettes dans ton message 1) le texte complet de la fonction dans sa dernière version, 2) le dernier appel de la fonction. Sans ça, difficile de savoir exactement ce qui se passe. L'impression que j'ai en lisant le message d'erreur, c'est que la REPL interprète "nombre" comme une variable et non comme une fonction, donc le problème pourrait se situer au niveau de la définition ou de l'appel de la fonction.

    Comme LISP est un peu déroutant, il faut chercher à avoir le maximum de clarté. Pour cela, il faut essayer de distinguer autant que possible les tâches à accomplir: tu n'est pas du tout obligé d'écrire une seule fonction, tu peux en écrire plusieurs, plus courtes et plus lisibles.

    Prends par exemple le critère selon lequel tu dois filtrer la liste: il faut que l'élément soit une liste et que son premier élément soit un nombre. On peut déjà écrire une fonction pour tester ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (defun conforme (element)
        (and (listp element) (numberp (car element))))
    Comme ça tu as déjà l'utilisation de AND.

    Tu peux ensuite écrire de façon plus claire ta fonction de filtre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun filtre (liste)
        (when liste ; si liste est vide on renvoie nil
            (if (conforme (car liste))
                    (cons (car liste) (filtre (cdr liste)))
                    (filtre (cdr liste)))))
    Plus généralement, la fonction que tu cherches à réaliser est un cas particulier d'une fonction "filtre" dont la définition est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (defun filtre (condition liste)
        (when liste 
            (if (funcall condition (car liste)) ; on appelle la fonction critère sur le premier élément de la liste
                    (cons (car liste) (filtre condition (cdr liste)))
                    (filtre condition (cdr liste)))))
    et que tu peux ensuite appeler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (filtre #'conforme '((1 a b) c (d e) (3 f g)))

  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
    Bien sûr, la fonction filtre existe déjà. Elle s’appelle remove-if-not.

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Points : 14
    Points
    14
    Par défaut problème d'indentation
    Bonjour,
    j'ai aussi eu ce souci et j'utilisais la touche d'indentation au lieu de mettre des espaces... a priori, LISP n'aime pas ça. En remplaçant pas deux espaces, plus d'erreur...

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

Discussions similaires

  1. [Exercices] Liste d'exercices corrigés en shell script et bash
    Par ok.Idriss dans le forum Shell et commandes GNU
    Réponses: 44
    Dernier message: 06/12/2014, 15h36
  2. Exercice liste chainée
    Par darkwall_37 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/12/2010, 04h44
  3. [PHP 5.2] Exercice : liste de données + remplisage de champ
    Par Raphael1980 dans le forum Langage
    Réponses: 0
    Dernier message: 28/04/2010, 13h52
  4. Exercice liste liée
    Par Isendar dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 30/05/2008, 07h50
  5. Probleme exercice list
    Par Gebudi. dans le forum C++
    Réponses: 6
    Dernier message: 31/07/2006, 15h43

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