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.
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.
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 : La Madeleine à la veilleuse de Georges de La Tour
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
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
pourquoi ne pas renverser la liste et en prendre le premier élément?
Salut
Tu as la fonction last
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part (last '(a b c d e)) --> E
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 : La Madeleine à la veilleuse de Georges de La Tour
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
Et une récusive fonctionnant avec car, cadr et cdr
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 (defun dernier(lst / der) (while lst (setq der (car lst) lst (cdr lst) ) ) der )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 (defun dernier(lst) (if (cadr lst) (dernier (cdr lst)) (car lst) ) )@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part (dernier '(a b c d e))
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 : La Madeleine à la veilleuse de Georges de La Tour
Salut
Pourquoi ?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.
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.
???Les setq devraient être interdits par les profs, (comme le scanf en C !).
@+
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 : La Madeleine à la veilleuse de Georges de La Tour
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
@+
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 : La Madeleine à la veilleuse de Georges de La Tour
Ok, merci
@+
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);
}
bonjour,
merci pour vous j'ai trouver la solution
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
Ou alors avec cond
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 (defun dernier (lst) (if (cdr lst) (dernier (cdr lst)) (car lst) ) )
De plus pour compléter la remarque suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 (defun dernier (lst) (cond ((cdr lst) (dernier (cdr lst))) (T (car lst)) ; T est optionnel dans ce cas ) )
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.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.
(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+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ) ) ) )
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager