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 qui détecte une circularité


Sujet :

Lisp

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Par défaut Fonction qui détecte une circularité
    Bonjour,

    j'ai du mal à trouver la réponse de cette exercice,

    2 - Fonction qui détecte une circularité
    Écrire la fonction récursive circulaire qui détecte qu'une liste plate (sans sous-listes) est circulaire par son début.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (setq liste '(a b c))
    (rplacd (cddr liste) liste) 
    (circulaire liste) => t
    (circulaire '(a b c a b c)) => nil
    Astuce : utilisez la fonction eq, qui compare deux adresses.

    mon essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun circulaire (liste)
     (cond
      ((atom liste) nil)      # si la liste est vide 
      ((eq (cdr liste) (car liste) t)
      ((circulaire (cdr liste) (car liste)) ) )
    mais ça ne marche pas :s

    de l'aide svp

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Bonjour,

    Astuce : utilisez la fonction eq, qui compare deux adresses.

    mon essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun circulaire (liste)
     (cond
      ((atom liste) nil)      # si la liste est vide 
      ((eq (cdr liste) (car liste) t)
      ((circulaire (cdr liste) (car liste)) ) )
    mais sa ne marche pas :s

    de l'aide svp[/QUOTE]

    C'était bien parti!

    Plutôt que de te donner la solution, je te donne quelques pistes...

    Le premier test ((atom liste) nil) et son résultat associé sont bons!

    Remarque: le test (eq (cdr liste) (car liste) vérifie si le reste de la liste (c'est-à-dire la liste sans le premier élément) est égal au premier élément de la liste. Comme on te dit que c'est une liste plate, son premier élément ne peut PAS être une liste.

    Remarque: à la fin, dans (circulaire (cdr liste) (car liste)), tu appelles (récursivement (ce qui est bien!)) circulaire, mais avec 2 arguments, ce qui, d'un certain point de vue, est une bonne idée, mais, d'un autre, comme la fonction n'a qu'un paramètre... ça marche pô!
    De plus (même remarque que précédemment), tu lui passes (car liste). Or, à aucun moment, on n'a besoin de s'interroger sur le contenu des éléments de la liste pour déterminer si elle est circulaire.

  3. #3
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Par défaut
    bonjour,

    je tente ce code,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun circulaire (liste &optional (origine liste))
    *(cond
    **((atom liste) nil)
    **((eq (cdr liste) origine)t)
    **((circulaire (cdr liste) origine)) ) )
    par contre quand je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [12]> (circulaire '(a b c a b c) (setq liste '(a b c)))
    NIL
    pourtant c une liste circulaire :s

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Bravo!
    Pour moi, c'est bon (sous réserve que &optional (origine liste) mette bien la valeur de liste dans origine lors d'un appel avec un argument (ça peut dépendre de la version de lisp utilisée))!

    par contre quand je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [12]> (circulaire '(a b c a b c) (setq liste '(a b c)))
    NIL
    pourtant c une liste circulaire :s
    Non non non! Y a pas de liste circulaire dans cet exemple!

    Si on appelle circulaire avec plus d'un argument, on fausse tout:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (setq liste '(b c d))
    (circulaire (cons 'a liste) liste) => t ; c'est de la triche...
    Dans ce cas, circulaire teste que son 2ème argument est une sous-liste de son premier argument.


    Pour avoir une vraie liste circulaire, reprends l'exemple de l'énoncé!

    Qu'obtiens-tu avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (setq liste '(a b c))
    (rplacd (cddr liste) liste) 
    (circulaire liste)

  5. #5
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Par défaut
    bonjour,

    quand j'essaye ces trois ligne, le deuxième m'envoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (setq liste '(a b c))
    
    (rplacd (cddr liste) liste) 
    
    (circulaire liste)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (rplacd (cddr liste) liste)
    *** - Il n'y a plus de place pour des objets LISP.
    *** - Il n'y a plus de place pour des objets LISP.
    *** - Il n'y a plus de place pour des objets LISP.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Hum... Il semblerait que ton interprète lisp ait du mal à afficher la liste circulaire ainsi créée!

    Quel lisp utilises-tu et sur quel OS ?

    Si c'est bien un problème d'affichage, tu peux remplacer la ligne par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (prog1 "tout va bien" (rplacd (cddr liste) liste)))
    ou bien par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (progn "Jusqu'ici, tout allait bien" (rplacd (cddr liste) liste)) "tout va bien")
    Tu peux aussi remplacer tout le bloc par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (let ((liste '(a b c)))
      (rplacd (cddr liste) liste) 
      (circulaire liste))

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

Discussions similaires

  1. Fonction qui retourne une collection
    Par superfly dans le forum Oracle
    Réponses: 9
    Dernier message: 25/06/2009, 18h02
  2. Fonction qui execute une opération mathematique
    Par durnambule dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 24/04/2007, 17h42
  3. Fonction qui change une variable
    Par Taz_8626 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/03/2006, 12h54
  4. Réponses: 15
    Dernier message: 26/03/2006, 12h10
  5. Réponses: 5
    Dernier message: 18/10/2005, 21h53

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