一个复杂的Lisp问题

时间:2014-11-02 08:46:11

标签: lisp

定义一个函数contains,它接受​​两个参数,一个符号A和一个符号列表L,只有当L包含A作为其元素之一时才返回t。

这是原始问题。我是LISP的新手,想要一些代码以及语法的解释。来自Java和C ++背景LISP本质上是非常不同的。请帮忙。

到目前为止,我的代码成功地将两个输入作为参数。

伪代码: 我将A中的值与List的第一个值进行比较,然后将列表和变量A传递回函数,并进行递归调用,直到List为空。如果List为空,则返回null。

这个问题是,如果List包含嵌套List,我如何识别嵌套循环。

例如:(contains #\b '(a (((b))) c)) - >必须打印出来。

到目前为止,我有什么代码:

(defun contains (a list)
    (if (eq a(car list))
        (princ "t")
        (contains a (cdr list))))

(contains  #\B '(B a c d e f g))

我需要一种在列表末尾进行检测的方法。以及在嵌套列表中搜索的方法。

1 个答案:

答案 0 :(得分:2)

首先让我们解决一些你的错误:#\b不是SYMBOL,它是一个CHARACTER,因为我知道我们在符号列表中寻找符号,所以我们不需要做一些字符 - >符号转换。第二:不要(princ t)只返回。

我的简短版本:

(defun contains (sym nested-list)
  "Find if NESTED-LIST contains a SYM"
  ;; Check if our list is CONS-cell?.
  (if (consp nested-list)
    ;; Recursion on cars and cdrs
    (or (contains sym (car nested-list))
        (contains sym (cdr nested-list)))
    ;; Elseway just check for equality
    (eq sym nested-list)))

CL-USER> (contains 'a '(b c (x b y (f a)) d))
T
CL-USER> (contains 'w '(b c (x b y (f a)) d))
NIL

在你的测试用例上:

CL-USER> (contains 'b '(a (((b))) c))
T