定义一个函数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))
我需要一种在列表末尾进行检测的方法。以及在嵌套列表中搜索的方法。
答案 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