2017-09-14 99 views
-2

INPUT:(A(B(d(E)(F)))(C)(K)) 我现在有两个功能,这给我的OUTPUT:如何在没有dolist的情况下在lisp中打印树,只有递归?

ç

ķ

d

d

Ë

˚F

Ë

NIL

但是我需要输出这样的:
一个:BCK
B:d
C:
k:
d:电子网

E:

F:

一个

b】S K

d

电子网

(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

我不明白这个问题。 '全部来自新线路' - 这是什么意思?您的问题缺乏预期输入和输出的有用示例。 –

+1

@RainerJoswig改变了它,是更清晰的? – ninjaknight

+0

@RainerJoswig新的堆栈,忘记添加所有的信息 – ninjaknight

回答

5

节点

你应该定义的第一件事:为节点中的某些数据结构的功能。

  • nodep事情 - >是事情的一个节点?
  • node-name节点 - >返回节点的名称
  • node-children节点 - >返回节点

广度优先

然后,我会定义一个函数的孩子以广度优先的顺序遍历一棵树。

  • breadth-firstFN&optional队列

此功能将呼吁在广度优先的顺序树的所有元素FN

  1. 如果没有节点,端
  2. 起飞队列中的第一个节点为当前节点
  3. 推当前节点的子节点到队列
  4. 呼叫功能FN的端部在当前节点上
  5. 调用本身与FN队列

将上面的循环写成递归函数。

呼叫广度优先

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

没有lambda表达式,它看起来怎么样? – ninjaknight

+0

我们的任务仅限于基本功能:car,cdr,cons,cond,for,print,列表长度,格式,apply,atom,setq – ninjaknight

相关问题