如果我在任何阶段都不清楚,请告诉我。我为不提供代码而道歉,但由于我自己缺乏知识,而且缺乏在线资料。我不能提供任何。
我正在编写一个函数,它将采用基于树状结构的嵌套列表。其中p表示父母,e和f是孩子。
基于我自己的知识。我相信这棵树将由输入表示:
((FE(feef)E)(efee)E(EEE(efef)))
我希望做的是逐级检查列表,并由组成它的4个或f表示每个e或f。
((FE(feef)E)(efee)的ë(EEE(efef)))
((FE(feef)E)(efee)的(EEEE)(EEE(efef)))
这最终会导致整个结构呈现如下:
((ffff)(eeee)(feef)(eeee) (eeee)(ffff)(eeee)(eeee)
(eeee)(eeee)(eeee)(eeee) (eeee)(eeee)(eeee)(efef))
然后我将使用flatten来提供所有符号的列表。这将是最终的输出。
我明白没有示例代码的问题不是好礼仪。但是我给出的问题很难,即使制定出一种方法也难以实现。如果有人可以提供任何帮助,无论是代码还是提示如何自己解决这个问题。我会非常感激。
答案 0 :(得分:1)
也许是这样的:
(defun expand-tree (tree)
(labels ((leafp (x) ; local function leafp
(and (consp x) ; if x is a cons
(= 4 (length x)) ; there are 4 elements in x
(every #'symbolp x)))) ; all of which are symbols
(loop :for e :in tree ; for every e(lement) in tree
:nconc ; destructively concatenate result of
(cond ((symbolp e) ; if e is a symbol
(list (list e e e e))) ; make e ((e e e e))
((leafp e) ; if e is a leaf
(list e)) ; wrap e in a list
(t (expand-tree e)))))) ; recurse for e
(expand-tree '((f e (f e e f) e)(e f e e) e (e e e (e f e f))))
; ==> ((f f f f) (e e e e) (f e e f) (e e e e) (e f e e)
; (e e e e) (e e e e) (e e e e) (e e e e) (e f e f))
这看起来不像问题中的结果,因为(efee)
看起来像一片叶子,就像(feef)
一样。