如何在没有dolist的情况下在lisp中打印树,只有递归?
问题描述:
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)))))
答
节点
你应该定义的第一件事:为节点中的某些数据结构的功能。
-
nodep
事情 - >是事情的一个节点? -
node-name
节点 - >返回节点的名称 -
node-children
节点 - >返回节点
广度优先
然后,我会定义一个函数的孩子以广度优先的顺序遍历一棵树。
-
breadth-first
树FN&optional
队列
此功能将呼吁在广度优先的顺序树的所有元素FN
。
- 如果没有节点,端
- 起飞队列中的第一个节点为当前节点
- 推当前节点的子节点到队列
- 呼叫功能
FN
的端部在当前节点上 - 调用本身与树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
我不明白这个问题。 '全部来自新线路' - 这是什么意思?您的问题缺乏预期输入和输出的有用示例。 –
@RainerJoswig改变了它,是更清晰的? – ninjaknight
@RainerJoswig新的堆栈,忘记添加所有的信息 – ninjaknight