Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂的Lisp问题_Lisp - Fatal编程技术网

复杂的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
不是关键字,它只是一个函数。