2014-09-24 88 views
-2

因此,我正在爲Lisp編寫一個語法,並且希望找到語法樹的最大深度。Lisp - 在嵌套列表中查找最大深度

例如,

(SENTENCE (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL MEN)) 
(VERB-PHRASE-PAST 
    ((VERBPAST SAW) (NOUN-PHRASE (DETERMINER THE) (NOUNPLURAL DOGS))))) 

最大深度應爲4(句子 - >動詞短語-過去 - >名詞短語 - >確定 - >的)。
然而,列表長度是3,並且在內部列表展開時總是不正確。

如何編寫一個函數來返回此最大深度(不使用任何外部庫)?

回答

5
(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