CLISP的嵌套列表和lambda表达式遇到了一些问题

时间:2011-09-01 06:26:30

标签: common-lisp clisp

Common Lisp中的嵌套列表让我很困惑。这是问题所在:

通过使用递归,让(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天,所以我希望你能给我一个 暗示。非常感谢!

1 个答案:

答案 0 :(得分:2)

首先,除非您错误输入if而不是iff这个问题非常简单,只需返回t即可完成: - )

严肃地说,当您需要使用递归解决问题时,这个想法通常只是:

  1. 如果我们处于一个微不足道的情况下,只需回答
  2. 否则,答案就是我们通过解决一个问题得到的答案,这个问题只是稍微简单一些,我们称之为自己来解决这个简化版本。
  3. 具体考虑:

    1. 如果第二个参数是空列表,则答案为NIL
    2. 如果第一个参数等于第二个参数的第一个元素,那么只需返回T
    3. 否则,如果第二个列表的第一个元素是一个列表(因此也可能是嵌套列表),并且该元素包含在此多列表中,则返回true(检查此情况下函数是否调用自身)
    4. 否则只是检查同样的问题,但首先删除第二个参数的第一个元素,因为它已被检查(这也是递归调用相同的函数)
    5. 所以基本上1和2是微不足道的案例; 3和4是您解决问题的简单版本的情况。