Tree LISP-检查嵌套列表
请让我知道,如果我在任何阶段不清楚。我很抱歉没有提供代码,但是,考虑到我自己缺乏知识和在线资料。我不能提供任何资料 我正在编写一个函数,它将采用基于树状结构的嵌套列表。其中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))) 这最终将导致整个结构呈现如下所示: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
((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个。