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而不是APPLYREDUCE没有任何列表长度限制。

+5

使用REDUCE而不是APPLY进行列表操作。 – 2014-09-24 04:56:59

+2

@RainerJoswig,'reduce'比'apply'更好吗?无论如何,'max'减少了它的论点。 – Mark 2014-09-24 13:00:45

+6

@Mark:上面的代码只能移植到列表最多50个项目。在Common Lisp中查看变量'CALL-ARGUMENTS-LIMIT'。 GCL:64,LispWorks:2047,CLISP 4096 ...“REDUCE”没有这个限制。 REDUCE用于折叠任意序列(列表和向量)。 'APPLY'用于将函数应用于*参数列表* - 它的大小限制可以低至50个参数。 – 2014-09-24 15:03:16