2017-09-14 6 views
-2

INPUT: (A (B (D (E) (F))) (C) (K)) j'ai actuellement deux fonctions, ce qui me donnent un signal de sortie:Comment imprimer l'arbre en Lisp sans dolist, seulement récursion?

A

B

C

K

B

D

D

E

F

E

NIL

Cependant, je dois sorties comme ceci:
a: BCK
b: d
c:
k:
d: e f

e:

f:

ou

un

b s k

d

e f

(defun print-children (s) 
    (cond ((null (caar (cdr s))) nil) 
     (t (print (caar (cdr s))) (print-children (cdr s))))) 

(defun print-tree (s) 
    (cond ((null s) nil) 
     ((atom (car s)) (print (car s)) (print-children s) (print-tree (cdr s))) 
     (t (print-tree (car s))))) 
+2

Je ne comprends pas cette question. "tout de la nouvelle ligne" - qu'est-ce que cela signifie? Votre question manque d'un exemple utile de l'entrée et de la sortie attendues. –

+1

@RainerJoswig l'a changé, est-ce plus clair? – ninjaknight

+0

@RainerJoswig nouveau à empiler, a oublié d'ajouter toutes les informations – ninjaknight

Répondre

5

Noeud

La première chose que vous devez définir: certaines fonctions de structure de données pour le nœud.

  • nodepchose -> est un nœud chose?
  • node-namenœud -> retourne le nom du nœud
  • node-childrennœud -> retour les enfants du nœud

Largeur première

alors je définir une fonction pour traverser un arbre dans l'ordre de grandeur.

  • breadth-firstarbrefn&optionalfile

Cette fonction appellerait FN sur tous les éléments de l'arbre afin d'en largeur.

  1. s'il n'y a pas de noeuds, fin
  2. prennent le premier noeud de la file d'attente en tant que noeud courant
  3. pousser les fils de noeud du noeud courant à la fin de la file d'attente
  4. appel de la fonction FN sur le noeud courant
  5. appel lui-même avec l'arbre fnfile

Écrivez cette boucle ci-dessus comme une fonction récursive.

Appel en largeur

CL-USER 76 > (breadth-first '(A (B (D (E) 
             (F))) 
           (C) 
           (K)) 
          (lambda (node) 
           (princ (node-name node)) 
           (princ ":") 
           (mapc (lambda (child) 
             (princ (node-name child))) 
            (node-children node)) 
           (terpri))) 
A:BCK 
B:D 
C: 
K: 
D:EF 
E: 
F: 
+0

comment cela ressemblerait-il sans lambdas? – ninjaknight

+0

notre tâche est limitée aux fonctions de base: voiture, cdr, contre, cond, pour, imprimer, liste-longueur, format, appliquer, atome, setq – ninjaknight