2017-10-05 108 views
-1

我需要在Lisp中編寫一個函數來檢查元素N是否在樹TREE中。檢查元素是否在樹中

(defun TREE-CONTAINS (N TREE) 
    (cond ((equal TREE nil) nil) 
     ((listp (CAR TREE)) (or (TREE-CONTAINS(N (CAR TREE))) 
           (TREE-CONTAINS(N (CDR TREE))))) 
     (t (cond ((equal N (CAR TREE)) t) 
        (t TREE-CONTAINS(N (CDR TREE))))) 
    ) 
) 

例如,(TREE-CONTAINS (1 ((1 2 3) 4 5)))將返回true。但是當我用這個例子測試我的代碼時,我總是收到一個錯誤,上面寫着「未定義的函數N調用了參數((2 3))」:(TREE-CONTAINS 2 '(1 2 3))。當然N應該是1,但我不知道它爲什麼認爲N是函數。任何想法?

+0

SO的代碼格式使用文本中的{}和代碼,您可以用反引號括起來例如。也可以使用''''''''來獲得格式化。當你把一個名字放在括號裏時,你把它稱爲一個函數。 '(+ 1 2)'調用'+'。你認爲'(N(CDR TREE))'會做什麼,但是試着叫'N'? – Sylwester

+0

謝謝,我明白你的意思了。但是,當我刪除CDR TREE的括號時,我會得到未綁定的CDR。 – user112358

+0

我很確定'(cdr tree)'是正確的,但它不應該是'n'的參數。你可能對algol語言很熟悉,所以你所做的就像Java中的'n(cdr(tree))',但是'cdr'是函數'n'不是。 – Sylwester

回答

0

在調用tree-contains或任何lisp函數時,不應在括號中包含括號。它是(function-name arg1 arg2),而不是(function-name (arg1 arg2))

因此,一開始,請移除調用(tree-contains(n (car tree)))的參數周圍的括號,如下所示:(tree-contains n (car tree))。類似地,在的那個or子句中的下一個呼叫。此外,最後一個條件:(t TREE-CONTAINS(N (CDR TREE)))應該像這樣調用:(t (tree-contains n (cdr tree)))