如何在没有dolist的情况下在lisp中打印树,只有递归?

时间:2017-09-14 16:05:46

标签: recursion printing tree lisp common-lisp

INPUT :( A(B(D(E)(F)))(C)(K)) 我目前有两个函数,它给我一个OUTPUT:

A

B

C

K

B

D

D

E

F

E

NIL

但是我需要这样的输出:
a:b c k
b:d
C:
K:
d:e f

E:

f:

a

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)))))

1 个答案:

答案 0 :(得分:5)

<强>节点

您应该首先定义:节点的一些数据结构函数。

  • nodep thing - &gt;是节点吗?
  • node-name node - &gt;返回节点的名称
  • node-children node - &gt;返回节点的子节点

广度优先

然后我将定义一个以广度优先顺序遍历树的函数。

  • breadth-first fn &optional 队列

此函数将以广度优先顺序在树的所有元素上调用FN

  1. 如果没有节点,请结束
  2. 将第一个节点作为当前节点从队列中取出
  3. 将当前节点的节点子节点推送到队列末尾
  4. 在当前节点上调用函数FN
  5. 使用树调用自身 fn
  6. 将上面的循环写为递归函数。

    呼叫BREADTH-FIRST

    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: