我有一棵树:
(A . ((C . ((D . nil)(E . nil)))
(B . ((F . nil)(G . nil)))))
我想把这棵树变成:
((A C D) (A C E) (A B F) (A B G))
我已经为此实现了这个功能:
(defun tree->paths (tree &optional buff)
(labels ((recurse (follow-ups extended-list)
(if follow-ups
(append (list (tree->paths (car follow-ups) extended-list))
(recurse (cdr follow-ups) extended-list))
nil)))
(rstyu:aif (cdr tree)
(recurse it (append buff (list (car tree))))
(append buff (list (car tree))))))
但应用它会导致:
(tree->paths '(A . ((C . ((D . nil) (E . nil)))
(B . ((F . nil) (G . nil))))))
=>
(((A C D) (A C E)) ((A B F) (A B G)))
我必须在递归中缺少某种附加/合并,但我没有看到它。