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 :

[Lisp] Modification d'une fonction (tours de Hanoi)


Sujet :

Lisp

  1. #1
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut [Lisp] Modification d'une fonction (tours de Hanoi)
    Bonjour,

    Je suis actuellement sur un projet de Lisp mais je rencontre une difficulté pour transformer la fonction de résolution de Hanoi.
    En effet, j'ai cette fonction qui m'affiche simplement les déplacements de chaque disque de pile en A B ou C. C étant la pile d'arrivée, B la pile intermédiaire et A la pile de départ.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (defun solveHanoi (pile A B C)
      (cond ((null pile))
               (and (solveHanoi (cdr pile) A C B)
                      (prin1 (format "disque %s de %s à %s" (car pile) A C)) (terpri)
                      (solveHanoi (cdr pile) B A C))
      )
    )
    Ce que j'aimerai, c'est de pouvoir modifier les piles et de retourner la pile d'arrivée qui devrait contenir la pile de départ au lieu d'afficher simplement les déplacements. Quelqu'un aurait une idée ?

    Merci

  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
    Désolé, mais j'ai rien compris

  3. #3
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Arf

    Désolée je me suis mal exprimée alors.

    En fait cette fonction des tours de Hanoi affiche les mouvements à effectuer.
    Par exemple je lui mets une pile de disques en paramètre (A B C D).
    Je l'appelle comme cela :

    (solveHanoi '(A B C D) 'A 'B 'C)
    Elle va m'afficher "Disque A de la pile A à C", etc...

    Moi ce que j'aimerai faire c'est placer en parametre les 3 piles et qu'elles soient modifiées dans la fonction.
    Exemple : (solveHanoi '(A B C D) '() '())
    et à la fin elle me renverrai la derniere liste en parametre qui contiendrait la premiere !

    J'espère que je me suis mieux fait comprendre

    Merci !

  4. #4
    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
    Je cois comprendre maintenant.
    J'ai pas encore cherché comment faire exactement, mais je pense qu'il faut s'orienter vers un truc où les piles sont définies comme ça (nom_pile contenu_pile)ce qui ferait un lancement du style (hanoi '(A '(a b c d)) '(B ()) '(C ()))

    Le plus simple est de définir des accesseurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (define (nom-pile pile)
      (car pile))
    (define (contenu-pile pile)
      (cdr pile))

  5. #5
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Je ne sais pas si c'est indispensable de garder le nom de la pile ?
    J'aurai tout simplement passé en paramètre des listes (A B C D) avec A le disque du sommet et D le dernier disque.

    J'ai également pensé à calquer la fonction avec les affichages puisqu'elle marche plutot bien, de cette façon là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (defun solveHanoi (pile A B C)
      (cond ((null A) nil)
               (and (solveHanoi (cdr A) C B)
                      (cons (car A) C)
                      (solveHanoi B (cdr A) C))
      )
    )
    mais il me semble que le (cons (car A) C) ne modifie pas C dans la suite de la fonction... Quoiqu'il en soit, ça ne marche pas mais c'etait pour expliquer plus concrétement ce que je souhaite faire

    Si quelqu'un a une idée, merci d'avance...

  6. #6
    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
    C'etait pour pouvoir éventuellement afficher les mouvements de plateau.
    [edit]
    D'autre part, pour que la modif soit prise en compte tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun solveHanoi (pile A B C)
      (cond ((null A) nil)
               (and (solveHanoi (cdr A) C B)
                       (solveHanoi B (cdr A) (cons (car A) C)))
      )
    )
    [/edit]

  7. #7
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Oui j'avais déjà essayé de cette façon mais la fonction me retourne nil.
    Et ce, même quand je veux renvoyer C ou l'afficher à chaque étape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (defun solveHanoi (A B C)
      (cond ((null A) C)
               (and (solveHanoi (cdr A) C B)
                      (print C)
                       (solveHanoi B (cdr A) (cons (car A) C)))
      )
    )
    Une autre idée ? Merci...

  8. #8
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    J'ai essayé autre chose, en retournant t à la place de C, ma fonction parcourt comme il faut la liste A jusqu'à la fin mais C est toujours vide...

    Aurai-je oublié quelque chose ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (defun solveHanoi (A B C)
      (cond ((null A) t)
               ((and (solveHanoi (cdr A) C B)
                      (prin1 (format "%s" C)) (terpri)
                       (solveHanoi B (cdr A) (cons (car A) C))))
      )
    )
    me renvoit :
    "nil"
    "nil"
    "nil"
    t

    avec (solveHani '(a b c d) '() '())

  9. #9
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    J'ai trouvé
    C'était tout bête en plus... Je remplace mon renvoit de true par le renvoit de C et j'imbrique les 2 appels à la fonction.
    Bon j'ai pas encore trouvé comment faire un affichage de cette manière car en dehors les listes ne prennent pas en compte les modifs mais bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (defun solveHanoi (A B C)
      (cond ((null A) C)
               ((solveHanoi (cdr A) (solveHanoi B (cdr A) (cons (car A) C))) B))
      )
    Merci de votre patience et de votre attention

  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
    Es-tu sûr de ce que tu as ecrit?
    Ça ne fonctionne pas (erreur de syntaxe, puis corrigée de code) j'obtiens (d) lorque je lance avec (solveHanoi '(a b c d) '() '())

  11. #11
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Y a peut-être des parenthèses là où il faut pas dans ce que j'ai recopié mais chez moi ça marche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (defun solveHanoi (A B C)
      (cond ((null A) C)
               ((solveHanoi (cdr A) (solveHanoi B (cdr A) (cons (car A) C)) B))
      )

  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
    Excuse moi d'insister, quelle version de Lisp utilises-tu ?
    Avec Scheme ou Allegro-CL je n'obtiens que (d)

  13. #13
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Désolée du retard j'ai eu des ptits blem de pc hem :p

    J'utilise le Lisp sous Emacs.
    Je refais un copier-coller de ma fonction quitte à me répéter (au cas où j'avais mal recopié avant) mais je t'assure que ceci marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (defun solveHanoi (A B C)
    	(cond ((null A) C)
    	        ((solveHanoi B (cdr A) (cons (car A) (solveHanoi (cdr A) C B))))
    ))
    Bien-sûr à l'appel de ma fonction je tape :
    (solveHanoi '(A B C D) '() '())

    Voilà j'espère que t'as trouvé

  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
    Là d'accord

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/04/2008, 11h02
  2. Modification d'une fonction pour selectionner une plage de cellule
    Par jackbauer972 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/08/2007, 16h07
  3. Modification d'une fonction "ShellExit"
    Par The Lord of Nesquik dans le forum C++
    Réponses: 11
    Dernier message: 12/06/2006, 03h57
  4. Aide sur modification d' une fonction.
    Par superadnan3 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2006, 18h29
  5. [Lisp] Communiquer avec une fonction en c++
    Par Nadine dans le forum Lisp
    Réponses: 5
    Dernier message: 10/01/2005, 21h15

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