Tree LISP-检查嵌套列表

Tree LISP-检查嵌套列表,tree,common-lisp,nested-lists,Tree,Common Lisp,Nested Lists,请让我知道,如果我在任何阶段不清楚。我很抱歉没有提供代码,但是,考虑到我自己缺乏知识和在线资料。我不能提供任何资料 我正在编写一个函数,它将采用基于树状结构的嵌套列表。其中p表示父级,e和f表示子级 根据我自己的知识。我相信这棵树可以用输入来表示: ((fe(feef)e)(efee)e(eee(efef))) 我想做的是逐级检查列表,并用组成它的4个e或f来表示每个e或f ((fe(feef)e)(efee)e(eee(efef))) ((fe(feef)e)(efee)(eeee)(eee

请让我知道,如果我在任何阶段不清楚。我很抱歉没有提供代码,但是,考虑到我自己缺乏知识和在线资料。我不能提供任何资料

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

根据我自己的知识。我相信这棵树可以用输入来表示:

((fe(feef)e)(efee)e(eee(efef)))

我想做的是逐级检查列表,并用组成它的4个e或f来表示每个e或f

((fe(feef)e)(efee)e(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))
(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))
然后我将使用flatte提供所有符号的列表。这将是最终输出


我明白没有示例代码的问题是不礼貌的。但是给我的问题已经够难的了,甚至连制定一个方法都证明是难以置信的困难。如果有人能提供任何帮助,无论是代码还是提示,都可以自己解决这个问题。我将不胜感激

可能是这样的:

((ffff)(eeee)(feef)(eeee) (eeee)(ffff)(eeee)(eeee)
 (eeee)(eeee)(eeee)(eeee) (eeee)(eeee)(eeee)(efef))
(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)
一样

你能澄清一下你所说的“构成它的4个e或f”是什么意思吗?最重要的问题是图像。其中e和f分别表示白色和黑色像素的象限。当我沿着树向下移动时,我正在观察一个越来越小的象限。图像的1/4。1/16等等。因此,在图像的1/4处有一个e。可以用4 1/16秒来查看。它可能由输入
((f e(f e e f e f)e)(e f e)e(e e e(e f e f e f))来表示)
。注意符号之间的空格。这更容易操作吗?只要我保持看起来比较相似的输入就没有问题。我认为这将非常有用。谢谢。你能简单地告诉我一下吗?我注意到循环很早就结束了。例如,应该返回(e)(e)(e)(e)(e)的e只是返回(e)。这个例子很明显,返回的括号应该是16个,但返回的括号只有10个。