IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lisp Discussion :

besoin d'aide en lisp


Sujet :

Lisp

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    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.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    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

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    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

  5. #5
    Membre habitué
    Inscrit en
    Juin 2002
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 195
    Points : 136
    Points
    136
    Par défaut
    pourquoi ne pas renverser la liste et en prendre le premier élément?

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 42
    Points
    42
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (last '(a b c d e)) --> E
    @+

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Patrick_35 Voir le message
    Salut

    Tu as la fonction last

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (last '(a b c d e)) --> E
    @+
    tu peux me donner le code de la fonction last

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 42
    Points
    42
    Par défaut
    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 : 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
    )
    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
    (defun dernier(lst)
      (if (cadr lst)
        (dernier (cdr lst))
        (car lst)
      )
    )
    @+

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 42
    Points
    42
    Par défaut
    Salut

    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.

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

    @+

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 42
    Points
    42
    Par défaut
    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

    @+

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 42
    Points
    42
    Par défaut
    Ok, merci

    @+

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    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);
    }

  17. #17
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    bonjour,

    merci pour vous j'ai trouver la solution

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 35
    Points : 63
    Points
    63
    Par défaut
    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 : 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)
      )
    )
    Ou alors avec cond
    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
      )
    )
    De plus pour compléter la remarque suivante :

    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+

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 27
    Points : 31
    Points
    31
    Par défaut c'est tres simple,ben voila ma reponse!
    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
               )
         )
    )
    )

Discussions similaires

  1. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 20h01
  2. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 09h29
  3. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 13h19
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 11h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo