Recursion 如何在lisp中打印树而不使用dolist,只使用递归?

Recursion 如何在lisp中打印树而不使用dolist,只使用递归?,recursion,printing,tree,lisp,common-lisp,Recursion,Printing,Tree,Lisp,Common Lisp,投入:(A(B(D(E)(F))(C)(K)) 我目前有两个函数,它们为我提供以下输出: A B C K B D D E F E 零 但是,我需要这样的输出: a:bck b:d c: k: d:EF e: f: 或 a b s k d EF 节点 首先应该定义:节点的一些数据结构函数 nodepthing->thing是节点吗 节点名称节点->返回节点名称 节点子节点节点->返回节点的子节点 宽度优先 然后我将定义一个函数以宽度优先的顺序遍历一棵树 宽度优先树fn&可选队列 此函数将按

投入:(A(B(D(E)(F))(C)(K)) 我目前有两个函数,它们为我提供以下输出:

A

B

C

K

B

D

D

E

F

E

但是,我需要这样的输出:
a:bck
b:d
c:
k:
d:EF

e:

f:

a

b s k

d

EF

节点

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

  • nodep
    thing->thing是节点吗
  • 节点名称
    节点->返回节点名称
  • 节点子节点
    节点->返回节点的子节点
宽度优先

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

  • 宽度优先
    树fn
    &可选
    队列
此函数将按宽度优先顺序对树的所有元素调用
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:
    

    我不明白这个问题这是什么意思?您的问题缺少一个有用的预期输入和输出示例。@RainerJoswig更改了它,是否更清楚?@RainerJoswig刚加入stack,忘记添加所有信息,这些函数应该做什么?我可以阅读代码,但例如,我不知道您打算对打印级别执行什么操作。@RainerJoswig PRINT-LEVEL(我将其重命名为PRINT-children)打印主节点的直接子节点。所有的问题都是先打印一棵树的宽度。没有lambdas它会是什么样子?我们的任务仅限于基本功能:car、cdr、cons、cond、for、print、list length、format、apply、atom、setq
    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: