如何从嵌套列表lisp中删除元素
你能帮我解决一个关于嵌套列表的棘手的家庭作业吗? 基本上,只要谓词evenp为true,我就应该从列表(或嵌套列表)中删除元素,保持整个列表的结构如何从嵌套列表lisp中删除元素,lisp,common-lisp,Lisp,Common Lisp,你能帮我解决一个关于嵌套列表的棘手的家庭作业吗? 基本上,只要谓词evenp为true,我就应该从列表(或嵌套列表)中删除元素,保持整个列表的结构 (Nopred 'evenp '(1 S d ((4)) (7) ((((8)))) u)) 它应该会回来 (1 S d (()) (7) (((()))) u) 这是我写的函数 (Defun nopred (f list) (Cond ((null list)) ((Symbolp (car list)) (cons (ca
(Nopred 'evenp '(1 S d ((4)) (7) ((((8)))) u))
它应该会回来
(1 S d (()) (7) (((()))) u)
这是我写的函数
(Defun nopred (f list)
(Cond ((null list))
((Symbolp (car list)) (cons (car list) (nopred f (cdr list)))
((Listp (car list)) (cons (nopred f ( car list)) (nopred f (cdr list))))
((Funcall f (car list)) (nopred f (cdr list)))
(T (cons (car list) (nopred f (cdr list))))))
我试图用这段代码来解决这个问题,但它不起作用,当evenp为true时,它不会删除元素,并且返回如下值
((((5 .T ) .).).)
您需要在
(空列表)
案例中返回NIL
。当匹配的COND
子句中没有返回值时,它返回条件的值,(空列表)
返回t
您在发布的代码中也有一些输入错误:(cdr l)
应该是(cdr列表)
,并且在该行末尾缺少一个)
(defun nopred (f list)
(cond ((null list) nil)
((symbolp (car list)) (cons (car list) (nopred f (cdr list))))
((listp (car list)) (cons (nopred f ( car list)) (nopred f (cdr list))))
((funcall f (car list)) (nopred f (cdr list)))
(t (cons (car list) (nopred f (cdr list))))))
通过这些更正,我得到了正确的结果:
(1 S d (nil) (7) (((nil))) u)
您需要在
(空列表)
案例中返回NIL
。当匹配的COND
子句中没有返回值时,它返回条件的值,(空列表)
返回t
您在发布的代码中也有一些输入错误:(cdr l)
应该是(cdr列表)
,并且在该行末尾缺少一个)
(defun nopred (f list)
(cond ((null list) nil)
((symbolp (car list)) (cons (car list) (nopred f (cdr list))))
((listp (car list)) (cons (nopred f ( car list)) (nopred f (cdr list))))
((funcall f (car list)) (nopred f (cdr list)))
(t (cons (car list) (nopred f (cdr list))))))
通过这些更正,我得到了正确的结果:
(1 S d (nil) (7) (((nil))) u)
(cdr l)
是复制错误吗?是否应该是(cdr列表)
?当缩进被纠正时,您可以看到问题。在Symbolp
行的末尾缺少一个)
,因此所有代码都被视为该情况的一部分。但这应该会导致错误,所以我怀疑这是另一个复制错误。用适当的缩进贴出实际的代码,否则我们就看不出真正的错误。对符号的特殊处理在意识形态上似乎是错误的。我明白这是为了避免(evenp S)
&c上的错误,但这仍然是错误的。感谢您回答@sds,但我不明白您的意思,情况非常简单和明显,如果列表中的元素是一个符号,那么我将放入列表并检查下一个,继续cdr。相反,我不太确定它是否正确(funcall f(car l)),据我所知,它将函数应用于arg。Thanks@MaxMnt:如果函数f
在符号上做了一些有趣的事情,该怎么办?(例如,检查他们的家庭套餐)您的nopred
无法工作。(cdr l)
是复制错误吗?是否应该是(cdr列表)
?当缩进被纠正时,您可以看到问题。在Symbolp
行的末尾缺少一个)
,因此所有代码都被视为该情况的一部分。但这应该会导致错误,所以我怀疑这是另一个复制错误。用适当的缩进贴出实际的代码,否则我们就看不出真正的错误。对符号的特殊处理在意识形态上似乎是错误的。我明白这是为了避免(evenp S)
&c上的错误,但这仍然是错误的。感谢您回答@sds,但我不明白您的意思,情况非常简单和明显,如果列表中的元素是一个符号,那么我将放入列表并检查下一个,继续cdr。相反,我不太确定它是否正确(funcall f(car l)),据我所知,它将函数应用于arg。Thanks@MaxMnt:如果函数f
在符号上做了一些有趣的事情,该怎么办?(例如,检查他们的家庭套餐)您的nopred
将无法工作。感谢@barmar的回答,可能是我在复制代码时犯了一些错误。(使用智能手机编写代码并不太舒服)。无论如何,我认为编写cond((null list)nil)将给出(nil)和((nil)),作为最终结果,这是不正确的,而不是在谓词evenp为真时,我应该得到空列表,所以类似于(1sd()(7)(())u)。另一个问题,它是否正确(funcall f(arg)),据我所知,funcall将f应用于arg。提前谢谢。@MaxMnt()
和nil
只是写入同一对象的不同方式,而repl打印机只能以一种方式打印。您可能需要一个符号列表,如”(t nil x y)
,或者您需要嵌套列表,其中一些是空的”(t()x y)
,但是它们在相等方面是相同的:(相等)(t nil x y);=>是的,我完全同意你说的。但是在这种情况下,结果必须是这个表示->(),而不是Nil。所以输出应该是->(1()3d((()))我试图用cons'(')或append'(()')替换Nil,但它不起作用。实际上,这是我在大学的下一次Lisp考试的一种问题,因此我正在寻找一种用“nil”来解决这个问题的方法。谢谢。@MaxMnt没问题。打印机显示nil
而不是()
的nil
,只要您使用结构,它就会这样显示。您可以创建结构的字符串表示形式或您自己的打印函数,将nil
打印为()
,但这只是事物的可视化方式,不会真正改变这样一个事实,即不这样做的结果是正确的。如果您使用对作为二叉树结构,并希望它显示为((leaf.leaf)。(leaf.leaf))
,标准打印机将始终显示为((leaf.leaf)leaf.leaf)
@sylvester是的,我明白您的意思。事实上,如果是我的话,我会让代码保持现在的状态。但由于测试是通过考试的最低要求之一,所以我仍然需要找到输出的解决方案。问题是,所有的东西都必须在一个函数中,所以打印不会有太多的工作,并且打印的结果是I(列表)和nil。C