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 :

modifier le ième élement d'une liste de n élément


Sujet :

Lisp

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut modifier le ième élement d'une liste de n élément
    Bonjour je chercher a modifier le ième élément d'une liste de n élément
    c'est à dire
    > (setq l '(1 2 3 4 5)) ; pour ex de liste
    > (modif l 3 "toto") ; modif reçois la liste le numero de l'indice de l'élément à modifier est la nouvelle valeur
    (1 2 3 "toto" 5)
    > l
    (1 2 3 "toto" 5)

  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é ?
    "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
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    as-tu au moins une idée d'algorithme récursif à utiliser sur la liste ?


    a priori, il ne faut pas oublier de :
    • choisir quoi faire si l'indice à modifier est plus grand que la liste
    • les "cas de base" sont
      • la liste vide
      • le fait d'atteindre le nième élément de la liste
    • la récursion conserve la tête de la liste qu'elle ajoute au reste de la liste qui aura été modifié



    après suivant le dialecte lisp utilisé, le code peut changer, mais tu auras sûrement accès à
    • car pour récupérer la tête de la liste (parfois appelé first)
    • cdr pour récupérer le reste d'une liste (parfois appelé rest)
    • un pattern-matching avec des when ou bien le branchement conditionnel (if (condition) (then-expr) (else-expr))
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Si tu es en common lisp, je crois que tu peux utiliser setf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (setf (nth 3 l) "toto")
    le seul lisp que je manipule actuellement est celui de mon éditeur (emacs), et cette fonction n'y est pas.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    il faut bannir le plus possible les approches à effet de bord, sauf si les performances nous y contraignent
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Voici une version récursive terminale:
    Code lisp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (defun modnth (n L x)
      (if (and (>= n 0) (< n (length L))) 
          (if (eq n 0) (rplaca L x)
          (modnth (- n 1) (cdr L) x)
          )
          ))
     
    (setq L '(a b c))
    (modnth 1 L 'x)
    L
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  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
    En Scheme on peut faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (modif n L x)
       (let ((t 0))
        (map (lambda (z)
                 (begin
                   (set! t (+ t 1))
                   (if (= t n)
                       x
                       z)))
               L)))
    Zavonen >> Calculer à chaque fois la longueur de la liste ne me parait pas une bonne chose.
    "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
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Zavonen >> Calculer à chaque fois la longueur de la liste ne me parait pas une bonne chose.
    Exact, il faut sortir cela de la récursion.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  9. #9
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    autre suggéstion proche de ce qui a déjà été dit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (defun replace (list n elem)
      ""
      (cond  
       ((eq () list) ()) 
       ((eq n 0) (cons elem (cdr list))) 
       (t (cons (car list) (replace (cdr list) (- n 1) elem)))))
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    autre suggéstion proche de ce qui a déjà été dit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (defun replace (list n elem)
      ""
      (cond  
       ((eq () list) ()) 
       ((eq n 0) (cons elem (cdr list))) 
       (t (cons (car list) (replace (cdr list) (- n 1) elem)))))

    pas loin du pseudo-code que je proposais... sauf que j'étais sur 2 if au lieu du cond
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    S'il s'agit de faire un remplacement 'en place', (ce que j'ai compris) un rplaca est beaucoup plus rapide que:
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    S'il s'agit de faire un remplacement 'en place', (ce que j'ai compris) un rplaca est beaucoup plus rapide que:
    certes mais mieux vaut privilégier la pureté du fonctionnel sauf contrainte (perf & cie)
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

Discussions similaires

  1. récupérer les élements d'une liste (<select>)
    Par ferrero dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/06/2007, 13h55
  2. Réponses: 1
    Dernier message: 02/04/2007, 15h56
  3. [Generics] ajouter un élement dans une liste typée
    Par anitshka dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 06/02/2007, 11h04
  4. [EXCEL] Modifier la cellule liée d'une liste déroulante
    Par stéphane_ais2 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/03/2006, 11h18
  5. acceder au n iéme element d'une liste std::list
    Par sorari dans le forum SL & STL
    Réponses: 4
    Dernier message: 23/03/2005, 15h21

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