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 03/01/2011, 22h26   #1
david0924
Invité de passage
 
david pinery
Inscription : mai 2010
Messages : 23
Détails du profil
Informations personnelles :
Nom : david pinery

Informations forums :
Inscription : mai 2010
Messages : 23
Points : 1
Points : 1
Par défaut besoin d'aide en lisp

Bonjour,

je suis débutant en lisp je voudrais faire un code qui me permet de m'afficher le dernier d'une lisp en utilisant cdr e car cons ...

merci pour votre aide.
david0924 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 22h35   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
Qu'as-tu déjà tenté ?
Comment peux-tu savoir que tu es arrivé au dernier élément d'une 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
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 22h42   #3
david0924
Invité de passage
 
david pinery
Inscription : mai 2010
Messages : 23
Détails du profil
Informations personnelles :
Nom : david pinery

Informations forums :
Inscription : mai 2010
Messages : 23
Points : 1
Points : 1
en fait j'ai un code qui définit les fonctions cdr et car cons, je vais créer une fonction qui met permet de renvoyer de le dernier élément d’une liste par exemple

(Dernier ‘(a b c d e))

le resultat c'est : e
david0924 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 22h59   #4
david0924
Invité de passage
 
david pinery
Inscription : mai 2010
Messages : 23
Détails du profil
Informations personnelles :
Nom : david pinery

Informations forums :
Inscription : mai 2010
Messages : 23
Points : 1
Points : 1
en fait j'ai un code qui définit les fonctions cdr et car cons, je vais créer une fonction qui met permet de renvoyer de le dernier élément d’une liste par exemple

(Dernier ‘(a b c d e))

le resultat c'est : e
david0924 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 07h49   #5
clovis
Membre régulier
 
Inscription : juin 2002
Messages : 158
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 158
Points : 83
Points : 83
pourquoi ne pas renverser la liste et en prendre le premier élément?
clovis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 17h18   #6
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
pourquoi ne pas renverser la liste et en prendre le premier élément?
Salut

Tu as la fonction last

Code :
(last '(a b c d e)) --> E
@+
Patrick_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 19h10   #7
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
Oui mais apparemment il ne connait que cons car et cdr.
Je pense qu'il connait aussi la récursivité.
__________________
"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 05/01/2011, 00h12   #8
david0924
Invité de passage
 
david pinery
Inscription : mai 2010
Messages : 23
Détails du profil
Informations personnelles :
Nom : david pinery

Informations forums :
Inscription : mai 2010
Messages : 23
Points : 1
Points : 1
Citation:
Envoyé par Patrick_35 Voir le message
Salut

Tu as la fonction last

Code :
(last '(a b c d e)) --> E
@+
tu peux me donner le code de la fonction last
david0924 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 09h48   #9
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 david0924 Voir le message
tu peux me donner le code de la fonction last
Salut

Last est une fonction comme car, cdr, etc..

Si je me base sur ce qu'indique Trap D, voici une fonction itérative fonctionnant avec une boucle while, car et cdr
Code :
1
2
3
4
5
6
7
8
(defun dernier(lst / der)
  (while lst
    (setq der (car lst)
	  lst (cdr lst)
    )
  )
  der
)
Et une récusive fonctionnant avec car, cadr et cdr
Code :
1
2
3
4
5
6
(defun dernier(lst)
  (if (cadr lst)
    (dernier (cdr lst))
    (car lst)
  )
)
@+
Patrick_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 10h51   #10
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
Il faut éviter l'impératif dans les débuts en Lisp, essaye de faire du fonctionnel, la récursivité n'est pas un vain mot, pas de while.
Les setq devraient être interdits par les profs, (comme le scanf en C !).
Ne conserve que la deuxième forme.
__________________
"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 05/01/2011, 11h37   #11
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
Salut

Citation:
Il faut éviter l'impératif dans les débuts en Lisp, essaye de faire du fonctionnel, la récursivité n'est pas un vain mot, pas de while.
Pourquoi ?
Avec des tests au benchmark, une boucle itérative est plus rapide qu'une boucle récursive.
De plus, cela évite des débordements de pile.

Citation:
Les setq devraient être interdits par les profs, (comme le scanf en C !).
???

@+
Patrick_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 13h56   #12
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
A mon avis, l'intérêt d'étudier le Lisp au début est de voir autre chose que la prog impérative, ce n'est pas tant le while qui m'ennuie que le setq, or tu es obligé de l'utiliser dans le while.
Pour ce qui est du scanf, tu ne peux comprendre si tu n'as jamais fait de C.
__________________
"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 05/01/2011, 16h19   #13
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
Je n'ai jamais fait de C, un peu de pascal dans ma jeunesse.
Donc, je reste dans l'expectative pour le setq, mais tu as surement raison

@+
Patrick_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 16h42   #14
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 434
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 434
Points : 5 298
Points : 5 298
Le setq à le défaut de modifier une variable, il a ce qu'on appelle des effets de bords, et pour faire une programmation "fiable" on essaye au maximum d'éviter les effets de bords.
Dans certains langages (haskell, F#, OCaml aussi je pense) , tu ne peux pas, par défaut, modifier une variable. Si tu veux le faire, il faut déclarer explicitement que cette variable sera modifiable.
__________________
"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 05/01/2011, 17h10   #15
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
Ok, merci

@+
Patrick_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 12h05   #16
david0924
Invité de passage
 
david pinery
Inscription : mai 2010
Messages : 23
Détails du profil
Informations personnelles :
Nom : david pinery

Informations forums :
Inscription : mai 2010
Messages : 23
Points : 1
Points : 1
Citation:
Envoyé par Trap D Voir le message
Le setq à le défaut de modifier une variable, il a ce qu'on appelle des effets de bords, et pour faire une programmation "fiable" on essaye au maximum d'éviter les effets de bords.
Dans certains langages (haskell, F#, OCaml aussi je pense) , tu ne peux pas, par défaut, modifier une variable. Si tu veux le faire, il faut déclarer explicitement que cette variable sera modifiable.

bonjour,

j'ai fais une fonction affiche le dernier element mais juste pour une liste de trois element cad
(last'(1 2 3)) le resultat 3 mais je fais une liste plus que trois il me donne juste le 3 eme element comme resulat la fonction c'est

while((a0=cdr(a0)) == nil){
a1=cons(cdr(a0), nil);
//a0=cdr(a0);
ULprint.obj_print(a1);
}
david0924 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 12h23   #17
david0924
Invité de passage
 
david pinery
Inscription : mai 2010
Messages : 23
Détails du profil
Informations personnelles :
Nom : david pinery

Informations forums :
Inscription : mai 2010
Messages : 23
Points : 1
Points : 1
bonjour,

merci pour vous j'ai trouver la solution
david0924 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 12h41   #18
Bruno-Vdh
Invité de passage
 
Bruno
Inscription : janvier 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Bruno

Informations forums :
Inscription : janvier 2011
Messages : 3
Points : 1
Points : 1
Bonjour david0924

Etrange ta fonction avec les accolades, je ne reconnais pas la syntaxe Lisp utilisé…

Sinon voici une variante (sans cadr) à la fonction proposé par Patrick_35, seulement avec car et cdr comme tu le souhaitais..

Avec if
Code :
1
2
3
4
5
6
(defun dernier (lst)
  (if (cdr lst)
    (dernier (cdr lst))
    (car lst)
  )
)
Ou alors avec cond
Code :
1
2
3
4
5
6
(defun dernier (lst)
  (cond    
    ((cdr lst) (dernier (cdr lst)))
    (T (car lst)) ; T est optionnel dans ce cas
  )
)
De plus pour compléter la remarque suivante :

Citation:
Avec des tests au benchmark, une boucle itérative est plus rapide qu'une boucle récursive.
De plus, cela évite des débordements de pile.
Il me semble que la fonction est naturellement tail-rec (il n’y a pas d’appel enveloppé), dans ce cas si ta version Lisp est optimisée pour, les remarques précédentes sur la limitation du tas, et la performance ne te concerne pas.

(Ps: Pour ma dernière remarque, je m’exprime sous votre contrôle car le dialecte Lisp que j’utilise ne me permet pas de vérifier cette dernière affirmation).

A+
Bruno-Vdh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2011, 13h02   #19
handetaker
Futur Membre du Club
 
Homme yorick
Étudiant
Inscription : avril 2011
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme yorick
Localisation : Finlande

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 17
Points : 15
Points : 15
Par défaut c'est tres simple,ben voila ma reponse!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
(defun dernier(lst)
 (setf z 0) // z  contiendra le dernier élément de notre liste "lst",initialiser à 0,et permet de l'enregistrer en mémoire contrairement à (letf z 0)
 (if ( or ( null lst  ) (not(listp lst))) //si  list est vide ou n'est pas une liste renvoie nil
   nil
    (do((i 0 (+ i 1)))//i est initialisé à 0 et ensuite incrémenter (i++)
       ((eql i (length lst)) z) // la boucle do s'arrête quand i=taille de la liste,et renvoie z
          (if (eql i (- (length lst) 1) )// si l'indice i est l'indice du dernier élément alors
                 (setf z (nth i lst))// mettre le dernier élément  dans z
           )
     )
)
)
handetaker 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 10h31.


 
 
 
 
Partenaires

Hébergement Web