Lisp - 在嵌套列表中查找最大深度
问题描述:
因此,我正在为Lisp编写一个语法,并且希望找到语法树的最大深度。Lisp - 在嵌套列表中查找最大深度
例如,
(SENTENCE (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL MEN))
(VERB-PHRASE-PAST
((VERBPAST SAW) (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL DOGS)))))
最大深度应为4(句子 - >动词短语-过去 - >名词短语 - >确定 - >的)。
然而,列表长度是3,并且在内部列表展开时总是不正确。
如何编写一个函数来返回此最大深度(不使用任何外部库)?
答
(defun max-depth (tree)
(if (atom tree)
0
(1+ (reduce #'max (mapcar #'max-depth tree)))))
您可能需要更改0值以符合您的规格。
注意:编辑为使用REDUCE
而不是APPLY
。 REDUCE
没有任何列表长度限制。
使用REDUCE而不是APPLY进行列表操作。 – 2014-09-24 04:56:59
@RainerJoswig,'reduce'比'apply'更好吗?无论如何,'max'减少了它的论点。 – Mark 2014-09-24 13:00:45
@Mark:上面的代码只能移植到列表最多50个项目。在Common Lisp中查看变量'CALL-ARGUMENTS-LIMIT'。 GCL:64,LispWorks:2047,CLISP 4096 ...“REDUCE”没有这个限制。 REDUCE用于折叠任意序列(列表和向量)。 'APPLY'用于将函数应用于*参数列表* - 它的大小限制可以低至50个参数。 – 2014-09-24 15:03:16