|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 24 ![]() |
Bonjour,
Je cherche une fonction pour parcourir des listes contenant ou pas des sous listes. Par exemple : (a ( b c) d (e f) (g h) i j k) Ensuite je cherche à effectuer des comparaisons entre chaque atome et un autre atome rentré par l'utilisateur. La fonction sera récursive. La fonction ressemblerait à cela : Fonction (liste) SI pas de liste alors renvoie nil SI le premier élément n' est pas une liste, alors affiche le moi et continue avec fonction(liste (cdr argument)) SI le premier élément est une liste (donc sous liste) alors affiche moi son car et rentre dans cette liste. Affiche moi le car de cette sous liste. Bref je ne sais pas si je suis bien clair, mais ce que je veux une fonction qui parcours une liste contenant des sous listes ou non. Cette fonction me servira à comparer des atomes entre en eux rajoutant par exemple un deuxième argument après l'argument liste et en le comparent avec les atomes contenus dans cette liste... Toutes mes tentatives ont étaient des échecs, notamment par la mauvaise utilisation de cond. Voila et merci d'avance pour vos réponses. |
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : septembre 2003 Messages : 4 437 ![]() |
Eh bien, montre ce code qui ne marche pas, on te dira peut-être pourquoi.
__________________
"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 |
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 24 ![]() |
Voici mon bout de code
Code :
|
||
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : septembre 2003 Messages : 4 437 ![]() |
Je ne connais pas bien la syntaxe du Lisp, donc je marche un peu sur des oeufs.
Si j'ai bien compris tu voudrais que dans un premier temps ta fonction affiche (a b c d e f g h i j k) a partir de (a ( b c) d (e f) (g h) i j k) A partir de ça, la première clause du cond me parait correcte. Pour la seconde, il me semble que tu devrais écrire (cons (car liste) (parcours de cdr liste))) pour la troisième, il faut que tu concatène le parcours du premier élélment de la liste avec le parcours du reste de la liste, ça se traduit par (append (parcours (car liste)) (parcours (cdr liste)))
__________________
"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 |
|
|
00
|
|
|
#5 | ||||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 24 ![]() |
Merci pour votre réponse,
Je vais essayer ce que vous m'avez conseiller. J'ai par ailleurs trouvé une autre solution à ce problème. Une fonction qui parcours les listes plates si le car d'une liste est un atome, mais si le car de la liste est une liste (donc sous liste) la fonction fait la même chose, mais cette fois avec le car de liste. Bref voici le code: La fonction qui parcours les listes plates: Code :
Code :
Code :
((eq(listp(car liste))T)(and(parcours(car liste))(parcours_tout(cdr liste)))) Merci encore en tout cas. |
||||
|
|
00
|
|
|
#6 | |||||||
|
Invité régulier
![]() Inscription : mai 2008 Messages : 10 ![]() |
Citation:
voici une version qui marche, normalement.c'est à tester: Code :
|
|||||||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 24 ![]() |
Merci pour vos réponses apparemment le dernier bout de code marche très bien, mis à part un doublon du premier élément quand j'appelle la fonction.
Par exemple : (a (b c) d e f) a b c d e f a Mais ce que je voudrais savoir surtout c'est pourquoi mon code ne marchait pas, j'ai réessayer plusieurs fois ma chance avant de tenter votre bout de code mais je n'ai rien trouvé... Je pense tout d'abord que la première condition de mon cond était fausse. En effet Trap D cette clause est fausse car elle dit: --> si pas de liste sortir de la récursivité Hors si je vide ma première sous liste (a b), et qu'une fois le b parti je me retrouve avec () donc pas de liste, et je me retrouve sorti de ma récursivité sans avoir tester le reste de ma liste. Est-ce que j'ai bien raison? Bref je vous remercie pour vos réponses, mais si puis-je avoir plus de précisions sur ce que fait notamment prog1 , je pense que cela m'aiderait. Merci encore. |
|
|
00
|
|
|
#8 | |
![]() ![]() Inscription : septembre 2003 Messages : 4 437 ![]() |
Le parcours de liste peut s'écrire en gros comme ceci :
Citation:
__________________
"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 |
|
|
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 24 ![]() |
Bonjour,
Même si vous m'avez bien aider je souhaite finir ce poste par une version que j'ai trouvé en fouillant un peu dans mes cours et en bidouillant un peu: Code :
Merci encore pour votre aide en esperant que ce poste pourra servir dans le futur. |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com