Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 16 sur 16
  1. #1
    Futur Membre du Club
    Inscrit en
    mai 2008
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 159
    Points : 19
    Points
    19

    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 :
    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 :
    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 régulier
    Inscrit en
    juin 2002
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 162
    Points : 84
    Points
    84

    Par défaut

    Vérifier le type d'entité dans une liste:
    Code :
    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
    Inscrit en
    septembre 2003
    Messages
    4 559
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 559
    Points : 5 478
    Points
    5 478

    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 :
    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 : Intérieur avec jeune femme de Vilhelm Hammershoi

  4. #4
    Futur Membre du Club
    Inscrit en
    mai 2008
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 159
    Points : 19
    Points
    19

    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
    Inscrit en
    septembre 2003
    Messages
    4 559
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 559
    Points : 5 478
    Points
    5 478

    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 : Intérieur avec jeune femme de Vilhelm Hammershoi

  6. #6
    Futur Membre du Club
    Inscrit en
    mai 2008
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 159
    Points : 19
    Points
    19

    Par défaut

    Merci pour ton aide
    Non n'avons pas encore la fonction let
    donc je crois devoir m'en servir

  7. #7
    Futur Membre du Club
    Inscrit en
    mai 2008
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 159
    Points : 19
    Points
    19

    Par défaut

    je voulais que je ne dois pas m'en servir
    la version de lisp est 2.44.1

  8. #8
    Nouveau Membre du Club
    Inscrit en
    juillet 2010
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 31
    Points : 35
    Points
    35

    Par défaut

    Citation Envoyé par clovis Voir le message
    Vérifier le type d'entité dans une liste:
    Code :
    1
    2
    3
    4
    5
    6
    (foreach a liste
    (if (=(type a) 'list)
    (prompt "liste non plate..")
    )
    )
    Salut

    Code :
    (vl-some '(lambda(x) (=(type x) 'list)) liste)
    @+

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Inscrit en
    septembre 2003
    Messages
    4 559
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 559
    Points : 5 478
    Points
    5 478

    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 :
    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 : Intérieur avec jeune femme de Vilhelm Hammershoi

  10. #10
    Nouveau Membre du Club
    Inscrit en
    juillet 2010
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 31
    Points : 35
    Points
    35

    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
    Inscrit en
    septembre 2003
    Messages
    4 559
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 559
    Points : 5 478
    Points
    5 478

    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 : Intérieur avec jeune femme de Vilhelm Hammershoi

  12. #12
    Futur Membre du Club
    Inscrit en
    mai 2008
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 159
    Points : 19
    Points
    19

    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 :
    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
    Inscrit en
    septembre 2003
    Messages
    4 559
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 559
    Points : 5 478
    Points
    5 478

    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 : Intérieur avec jeune femme de Vilhelm Hammershoi

  14. #14
    Futur Membre du Club
    Inscrit en
    mai 2008
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 159
    Points : 19
    Points
    19

    Par défaut

    en fait je suis rester sur fonction
    ca marche à quelque détail
    Code :
    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
    Inscrit en
    septembre 2003
    Messages
    4 559
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 559
    Points : 5 478
    Points
    5 478

    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 : Intérieur avec jeune femme de Vilhelm Hammershoi

  16. #16
    Futur Membre du Club
    Inscrit en
    mai 2008
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 159
    Points : 19
    Points
    19

    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 :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •