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 :

probleme fonction pour detection circularité


Sujet :

Lisp

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut probleme fonction pour detection circularité
    Voila ca fait une semaine que je me prend la tete et je n'arrive pas à faire cet exo je dois créer une fonction qui détecte une circularité

    Ecrire 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
    5
    (setq liste '(a b c))
    (rplacd (cddr liste) liste)
     
    (circulaire liste) => t
    (circulaire '(a b c a b c)) => nil
    Utilisez la fonction eq, qui compare deux adresses.

    voila ce que j'ai pondu
    mais ca ne marche pas
    merci de m'expliquer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun circulaire (liste &aux frst)
     (setq frst (car liste))
     (atom (liste) nil)
     (cond
      ((eq (cadr liste) frst) t)
      ((circulaire (cdr liste))) ))
    merci

  2. #2
    Membre habitué
    Inscrit en
    Juin 2002
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 195
    Points : 136
    Points
    136
    Par défaut
    Vérifier le type d'entité dans une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (foreach a liste
    (if (=(type a) 'list)
    (prompt "liste non plate..")
    )
    )

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Compare les adresses de tous les éléments de la liste avec l'adresse de son premier élément? Le processus s'arrête dans deux cas : tu parcours la liste en entier (cdr = '()) et ta liste n'est pas circulaire, ou l'égalité réussit et là, la liste est circulaire.
    ça ne marche que si le "dernier" élément de la liste est rebranché sur le premier élément de cette liste.
    Tu peux aussi parcourir ta liste en mémorisant les adresses et à chaque nouvelle adresse tu vérifie qu'elle n'existe pas déjà avant de l'insérer.
    ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun circulaire (liste &aux frst)
     (setq frst (car liste))
     (atom (liste) nil)
     (cond
      ((eq (cadr liste) frst) t)
      ((circulaire (cdr liste))) ))
    ne fonctionnne pas car à chaque apppel de circulaire tu redéfinis frst.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    ok merci
    mais comment faire pour que frst garde l'adresse du premier element
    c'est moi qui tourne en rond et pas liste

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    As-tu entendu parler de let ???
    Le problème est que je connais la syntaxe de Scheme mais plus très bien celle du LISP. Les deux langages sont semblables mais diffèrent cependant
    Quel LISP as-tu ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    Merci pour ton aide
    Non n'avons pas encore la fonction let
    donc je crois devoir m'en servir

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    je voulais que je ne dois pas m'en servir
    la version de lisp est 2.44.1

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par clovis Voir le message
    Vérifier le type d'entité dans une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (foreach a liste
    (if (=(type a) 'list)
    (prompt "liste non plate..")
    )
    )
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (vl-some '(lambda(x) (=(type x) 'list)) liste)
    @+

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Patrick_35 >> Tu pourrais expliquer ? Tu as testé ? Je ne crois pas vl-some se retrouve dans tous les lisp à part celui d'autocad.

    djbad>> Il faut faire une fonction qui compare les éléments d'une liste a un element donné :

    Typiquement tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (defun circulaire (liste)
       circulaire_1 (car liste) (cdr liste))
    A toi de voir maintenant ce que dois faire circulaire_1, quel est son contrat.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Patrick_35 >> Tu pourrais expliquer ? Tu as testé ? Je ne crois pas vl-some se retrouve dans tous les lisp à part celui d'autocad.
    Salut

    Extrait de l'aide d'Autocad
    Checks whether the predicate is not nil for one element combination

    (vl-some predicate-functionlist [list]...)
    Arguments

    predicate-function
    The test function. This can be any function that accepts as many arguments as there are lists provided with vl-some, and returns T on a user-specified condition. The predicate-function value can take one of the following forms:

    A symbol (function name)
    '(LAMBDA (A1 A2) ...)
    (FUNCTION (LAMBDA (A1 A2) ...))
    list
    A list to be tested.

    The vl-some function passes the first element of each supplied list as an argument to the test function, then the next element from each list, and so on. Evaluation stops as soon as the predicate function returns a non-nil value for an argument combination, or until all elements have been processed in one of the lists.

    Return Values

    The predicate value, if predicate-function returned a value other than nil; otherwise nil.

    Examples

    The following example checks whether nlst (a number list) has equal elements in sequence:
    J'ai bien remarqué qu'il y avait différents lisps, et je connais très bien celui d'Autocad. Je pensais que le sujet s'y référait.
    Désolé si ce n'est pas le cas. Pas toujours facile de deviner.

    @+

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est vrai qu'il faudrait préciser dans le titre du sujet si c'est du Common Lisp ou de l'Autocad, je crois qu'il y a des fonctions spécialisées pour AutoCad (justement celle qui commencent par vl- je crois).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Patrick_35 >> Tu pourrais expliquer ? Tu as testé ? Je ne crois pas vl-some se retrouve dans tous les lisp à part celui d'autocad.

    djbad>> Il faut faire une fonction qui compare les éléments d'une liste a un element donné :

    Typiquement tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (defun circulaire (liste)
       circulaire_1 (car liste) (cdr liste))
    A toi de voir maintenant ce que dois faire circulaire_1, quel est son contrat.
    Merci encore pour ton aide
    je dois faire 2 fonctions c'est ça

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Pour moi oui, si tu ne connais pas le let.
    La première, je te l'ai donnée.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    en fait je suis rester sur fonction
    ca marche à quelque détail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun circulaire (liste &optional (original liste))
     (cond
      ((atom liste) nil)
      ((eq (cdr liste) original)t)
      ((circulaire (cdr liste)  original)) ) )
    mais comment afficher nil si ma liste contient des sous listes
    ou que ma liste n'est pas circulaire au début mais du genre (a b c b c b c...)
    merci pour ton aide

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si ta liste n'est circulaire qu'à partir d'un certain rang, il faut mémoriser tous les éléments visités.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    Bonjour je relance le sujet comme j'essaie de m'améliorer
    tu m'avais parler de la fonction let
    comme je suis en train de la voir en ce moment
    j'aimerais approfondir
    donc j'ai essayé de revoir ma fonction
    mais je patauge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun circulaire (liste)
     (let ((x (car liste))(y (cdr liste))) # cela me permet de garder le premier élément
    (cond
     ((eq x (car y)))
     ((..............) # la je suis perdu je ne sais pas quoi mettre
    Merci en tout cas

Discussions similaires

  1. [WD17] Probleme avec la fonction "POUR TOUTE LIGNE DE"
    Par lololebricoleur dans le forum WinDev
    Réponses: 19
    Dernier message: 25/04/2012, 00h58
  2. Probleme vba pour renvoyer une valeur en fonction de deux criteres
    Par tarif dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2008, 20h28
  3. Réponses: 5
    Dernier message: 10/12/2007, 04h02
  4. VBA probleme Acces pour fonction somme Excel
    Par darkspoilt dans le forum Général VBA
    Réponses: 1
    Dernier message: 11/05/2007, 18h15
  5. [onKeydown] Probleme avec pour detecter les majuscules des minuscules
    Par magnus2005 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/09/2006, 23h48

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