Bonjour,
J'ai besoin d'aide concernant une fonction lisp.
J'ai deux fonctions :
- add qui ajoute un nombre dans un arbre :
- make-tree qui créer un arbre d'après un fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 (defun add (c tree) (cond ((not tree) (list c)) ((char>= c (car tree)) (list (car tree) (cadr tree) (add c (caddr tree)))) ;;((list (car tree) (add c (cadr tree)) (caddr tree))) ) ) ((list (car tree) (add c (cadr tree)) (caddr tree))) ) )
(le fichier contient un caractère par ligne)
Admettons que mon fichier "lettres.txt" contient ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 (defun make-tree (fich &aux (liste nil)) (setq charlist (open fich :direction :input :if-does-not-exist :error)) (loop (cond ((not (setq ligne (read-line charlist nil nil))) (return)) ) (setq tree (add (read-from-string ligne) tree)) ) (close charlist) )
Alors voici ce que j'obtiens dans l’interprète :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #\r #\a #\j #\b #\m #\k #\p
J'en viens maintenant à la fonction qui me pose problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 > (setq tree nil) nil > (make-tree "texte.txt") t > tree (#\r (#\a NIL (#\j (#\b) (#\m (#\k) (#\p)))) NIL)
Cette fonction est sensée remplacer la fonction add et insérer directement des éléments dans la liste avec rplacd et replaca.
- On ne peut commencer avec nil car il n'a pas de cdr. Donc on initalise la liste avec le premier élément.
(setq tree (premier_elm))
- Pour ajouter une branche de droite dans un arbre (#\r) il faut au préalable ajoute un branche de gauche : (#\r nil) sinon le second pointeur cdr n'existe pas encore.
- Ma fonction doit comporter un cond avec 6 cas distincts (a, b, c sont des caractères et x est le caractère à insérer) :
1) on a (a) et x > a : on modifie en (#\a nil (x)) avec deux rplacd
2) on a (a (b...)) et x > a : on modifie en (#\a (#\b...) (x)) avec un rplacd
3) on a (# (b...) (c..)) et x >a : on continue avec la branche (c...)
4) on a (a) et x < a : on modifie en (a (x)) avec un rplacd
5) on a (a nil (b...)) et x < a : on modifie en (a (x) (b...)) avec rplaca
6) on a (a (b...) (c...)) et x < a : on continue avec la branche (b...)
Voilà c'est ici que je coince. Je ne sais pas comment m'y prendre pour monter cette fonction. Si quelqu'un peut m'aiguiller je ne refuserais pas.
Merci d'avance.
Partager