Common lisp CLISP'出现了一些问题;s嵌套列表和lambda表达式

Common lisp CLISP'出现了一些问题;s嵌套列表和lambda表达式,common-lisp,clisp,Common Lisp,Clisp,CommonLisp中的嵌套列表真让我困惑。问题是: 通过使用递归,让(嵌套列表“b”(a(bc)d))返回t 如果第一个参数出现在第二个参数中(可能是 嵌套列表),否则为nil。 我尝试了查找,但它仅在第一个参数为'(b c)时有效。 我把目光转向兰姆达的表情。我想把第二个弄平 参数,然后使用eq比较参数 (defun nested-list (x y) (cond ((null y) ()) (t (append (lambda (flatten) (f

CommonLisp中的嵌套列表真让我困惑。问题是:

通过使用递归,让
(嵌套列表“b”(a(bc)d))
返回
t
如果第一个参数出现在第二个参数中(可能是 嵌套列表),否则为
nil

我尝试了
查找
,但它仅在第一个参数为
'(b c)
时有效。 我把目光转向兰姆达的表情。我想把第二个弄平 参数,然后使用
eq
比较参数

(defun nested-list (x y)
  (cond     
    ((null y) ())    
    (t (append (lambda (flatten) (first y))
然后我被卡住了。尽管我读了很多关于lambda的东西 我还是很困惑。我不知道什么时候能回忆起它 我需要,我知道funcall函数,但你知道我就是不能得到 信息技术我刚学了5天的通用口齿不清,希望你能给我一个机会
暗示。非常感谢

首先,除非您错误地键入了
if
而不是
iff
,否则问题很小,只需返回
t
,您就完成了:-)

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

  • 如果我们遇到了一个小问题,只需返回答案
  • 否则答案和我们通过解决一个比这个简单一点的问题得到的答案是一样的,我们称自己来解决这个简化版本
  • 具体而言,应考虑:

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

  • 所以基本上1和2是普通的情况;3和4是解决问题的更简单版本的情况。

    该函数的名称非常糟糕。它应该是类似于
    tree-contains-p
    。非常感谢,我认为我如何处理这个问题还不清楚。尽管我仔细阅读了你的建议,但我还是被代码缠住了。就像我知道如何计划,但不知道如何正确实施一样