2011-09-01 70 views
0

Common Lisp中的嵌套列表讓我很困惑。這裏的問題是:在CLISP的嵌套列表和lambda表達式中遇到了一些問題

使用遞歸,讓(nested-list 'b '(a (b c) d))t 如果第一個參數出現在第二個參數(這可能是 嵌套列表),並nil否則。

我試過find,但它只適用於第一個參數是'(b c)。 我把目光轉向了lambda表達式。我想首先將第二個參數 拉平,然後使用eq來比較參數。

(defun nested-list (x y) 
    (cond  
    ((null y)())  
    (t (append (lambda (flatten) (first y)) 

然後我卡住了。儘管我讀了很多有關lambda 的信息,但它仍令我困惑。當我需要 時,我不知道該如何回憶它,我知道funcall函數,但是你知道我只是不能得到 它。我剛學了Common Lisp 5天,所以我希望你能給我一個 提示。非常感謝!

+2

該函數的名稱非常糟糕。它應該像'tree-contains-p'。 – Svante

回答

2

首先,除非你輸錯if而不是iff這個問題是相當瑣碎,只返回t和你:-)

完成

認真說起來,而不是當你需要使用遞歸的想法往往是解決問題很簡單:

  1. 如果我們是在一個簡單的情況下,只返回答案
  2. 否則,答案是我們希望通過解決它的簡單只是一點點,這個問題得到了同樣的答案,我們稱自己爲sol這個簡化版本。

在具體考慮:

  1. 如果第二個參數是一個空列表答案是NIL
  2. 如果第一個參數等於第二個參數的第一個元素然後就返回T而不是
  3. 否則,如果第二個列表的第一個元素是一個列表(因此也可能是一個嵌套列表),並且該元素包含在此多重列表中,則返回true(以檢查此情況下函數正在調用它自己)
  4. 否則只是檢查了同樣的問題,但首先下探第二個參數的第一個元素,因爲它已經被選中(這也叫遞歸功能相同)

所以基本上1和2是微不足道的情況下, ; 3和4是您解決問題更簡單版本的情況。

+0

非常感謝,我想我如何處理這個問題的方式不清楚。通過我仔細閱讀你的建議,我仍然糾結於代碼。就像我知道如何規劃它,但不知道如何做出正確的實施 – roccia