LISP - 检查嵌套列表

时间:2015-03-04 15:04:10

标签: tree common-lisp nested-lists

如果我在任何阶段都不清楚,请告诉我。我为不提供代码而道歉,但由于我自己缺乏知识,而且缺乏在线资料。我不能提供任何。

我正在编写一个函数,它将采用基于树状结构的嵌套列表。其中p表示父母,e和f是孩子。

The tree

基于我自己的知识。我相信这棵树将由输入表示:

((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来提供所有符号的列表。这将是最终的输出。

我明白没有示例代码的问题不是好礼仪。但是我给出的问题很难,即使制定出一种方法也难以实现。如果有人可以提供任何帮助,无论是代码还是提示如何自己解决这个问题。我会非常感激。

1 个答案:

答案 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)一样。