复杂的Lisp问题
定义一个函数复杂的Lisp问题,lisp,Lisp,定义一个函数包含,该函数接受两个参数,一个符号a和一组符号L,并且仅当L包含a作为其元素之一时才返回t 这是最初的问题。我对LISP非常陌生,希望有一些代码和语法解释。来自java和C++背景的LISP本质上是非常不同的。请帮忙 到目前为止,我的代码成功地将两个输入作为参数 伪代码: 我将A中的值与列表的第一个值进行比较,然后通过递归调用将列表和变量A传递回函数,直到列表为空。如果列表为空,则返回null 问题是,如果列表包含嵌套列表,如何识别嵌套循环 例如:(包含#\b'(a(((b))c))
包含
,该函数接受两个参数,一个符号a和一组符号L,并且仅当L包含a作为其元素之一时才返回t
这是最初的问题。我对LISP非常陌生,希望有一些代码和语法解释。来自java和C++背景的LISP本质上是非常不同的。请帮忙
到目前为止,我的代码成功地将两个输入作为参数
伪代码:
我将A中的值与列表的第一个值进行比较,然后通过递归调用将列表和变量A传递回函数,直到列表为空。如果列表为空,则返回null
问题是,如果列表包含嵌套列表,如何识别嵌套循环
例如:(包含#\b'(a(((b))c))
->必须打印为true
到目前为止,我的代码是:
(defun contains (a list)
(if (eq a(car list))
(princ "t")
(contains a (cdr list))))
(contains #\B '(B a c d e f g))
我需要一种在列表末尾检测的方法。还有一种在嵌套列表中搜索的方法。首先,让我们修复一些错误:
\b
不是符号,而是字符,据我所知,我们在符号列表中查找符号,因此不需要进行字符->符号转换。第二:不要(原则t)
只返回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
我假设您不允许使用标准的
成员
函数?问题不要求您进入嵌套列表。不幸的是,不允许,我只允许使用基本函数,如defun、car cdr cons,如果问题定义说L
是一个符号列表<代码>(a(((b))c)不是一个符号列表,它是一个符号列表、一个列表和另一个符号。这是一个示例列表。该函数也可以扫描变量的嵌套列表,然后跳回外部列表并继续扫描外部列表。它还必须扫描所有嵌套列表。关键字consp做什么?@AdityaNishtala,我在代码中添加了一些注释,consp
检查它是否是CONS-CELL参数。所以我们基本上看了一下清单。如果我们有一个嵌套列表,我们进入其中,如果我们有一个原子,我们只是检查与符号是否相等。而且consp
不是关键字,它只是一个函数。