Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Lisp
Lisp Forum d'entraide sur la programmation en langages fonctionnels Lisp et Common Lisp
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/10/2010, 15h43   #1
djbad
Futur Membre du Club
 
Inscription : mai 2008
Messages : 154
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 154
Points : 17
Points : 17
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
djbad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2010, 08h01   #2
clovis
Membre régulier
 
Inscription : juin 2002
Messages : 158
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 158
Points : 83
Points : 83
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..")
)
)
clovis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2010, 08h56   #3
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 435
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 435
Points : 5 300
Points : 5 300
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
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2010, 15h27   #4
djbad
Futur Membre du Club
 
Inscription : mai 2008
Messages : 154
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 154
Points : 17
Points : 17
ok merci
mais comment faire pour que frst garde l'adresse du premier element
c'est moi qui tourne en rond et pas liste
djbad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2010, 19h06   #5
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 435
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 435
Points : 5 300
Points : 5 300
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
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2010, 14h08   #6
djbad
Futur Membre du Club
 
Inscription : mai 2008
Messages : 154
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 154
Points : 17
Points : 17
Merci pour ton aide
Non n'avons pas encore la fonction let
donc je crois devoir m'en servir
djbad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2010, 15h16   #7
djbad
Futur Membre du Club
 
Inscription : mai 2008
Messages : 154
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 154
Points : 17
Points : 17
je voulais que je ne dois pas m'en servir
la version de lisp est 2.44.1
djbad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2010, 16h31   #8
Patrick_35
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 31
Points : 35
Points : 35
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)
@+
Patrick_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2010, 22h40   #9
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 435
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 435
Points : 5 300
Points : 5 300
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
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2010, 10h16   #10
Patrick_35
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 31
Points : 35
Points : 35
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
Citation:
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.

@+
Patrick_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2010, 15h52   #11
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 435
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 435
Points : 5 300
Points : 5 300
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
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2010, 14h25   #12
djbad
Futur Membre du Club
 
Inscription : mai 2008
Messages : 154
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 154
Points : 17
Points : 17
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
djbad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2010, 14h54   #13
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 435
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 435
Points : 5 300
Points : 5 300
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
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2010, 13h47   #14
djbad
Futur Membre du Club
 
Inscription : mai 2008
Messages : 154
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 154
Points : 17
Points : 17
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
djbad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2010, 14h22   #15
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 435
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 435
Points : 5 300
Points : 5 300
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
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 16h14   #16
djbad
Futur Membre du Club
 
Inscription : mai 2008
Messages : 154
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 154
Points : 17
Points : 17
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
djbad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h00.


 
 
 
 
Partenaires

Hébergement Web