0

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

通过使用递归, 如果第一个参数出现在第二个参数(可能是嵌套列表)中,则(nested-list 'b '(a (b c) d))返回,否则返回。tnil

我试过find了,但只有第一个参数是'(b c). 我把目光转向了 lambda 表达式。我想先展平第二个参数,然后用它eq来比较参数。

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

然后我就卡住了。尽管我读了很多关于 lambda 表达式的东西,但它仍然让我感到困惑。我不知道在需要时如何调用它,我知道 funcall 函数,但你知道我就是无法获得它。刚学了Common Lisp 5天,希望大家多多指教。非常感谢!

4

1 回答 1

2

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

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

  1. 如果我们在一个微不足道的情况下,只需返回答案
  2. 否则答案与我们通过解决一个问题得到的答案相同,它只是稍微简单一点,我们称自己来解决这个简化版本。

在具体考虑:

  1. 如果第二个参数是一个空列表,那么答案是NIL
  2. 如果第一个参数等于第二个参数的第一个元素,则直接T返回
  3. 否则,如果第二个列表的第一个元素是一个列表(因此也可能是一个嵌套列表)并且该元素包含在这个多重列表中,则返回 true(以检查这种情况,该函数正在调用自身)
  4. 否则只检查相同的问题,但首先删除第二个参数的第一个元素,因为它已被检查(这也递归调用相同的函数)

所以基本上 1 和 2 是微不足道的情况;3 和 4 是解决问题的简单版本的情况。

于 2011-09-01T07:06:43.337 回答