Lisp - 在嵌套列表列表中查找最大深度

Phi*_*zin -2 lisp list common-lisp

所以我在Lisp中编写一个语法,并希望找到语法树的最大深度.

例如,

(SENTENCE (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL MEN))
 (VERB-PHRASE-PAST 
  ((VERBPAST SAW) (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL DOGS)))))
Run Code Online (Sandbox Code Playgroud)

最大深度应为4(句子 - >动词 - 短语 - 过去 - >名词 - 短语 - >确定者 - >).
但是列表长度为3,并且在扩展内部列表时始终不正确.

如何编写函数来返回此最大深度(不使用任何外部库)?

Pau*_*ter 5

(defun max-depth (tree)
  (if (atom tree)
      0
      (1+ (reduce #'max (mapcar #'max-depth tree)))))
Run Code Online (Sandbox Code Playgroud)

您可能需要更改0值以适合您的规格.

注意:编辑使用REDUCE而不是APPLY.REDUCE没有任何列表长度限制.

  • @Mark:上面的代码只能处理最多50个项目的列表.在Common Lisp中查看变量`CALL-ARGUMENTS-LIMIT`.GCL:64,LispWorks:2047,CLISP 4096 ......`REDUCE`没有这个限制.`REDUCE`用于折叠任意序列(列表和向量).`APPLY`用于将函数应用于*参数列表* - 其大小限制可低至50个参数. (6认同)
  • 使用REDUCE而不是APPLY进行列表操作. (5认同)
  • @RainerJoswig,`reduce`比`apply`更好?无论如何,`max`减少了它的论点. (2认同)