我刚开始在2天前学习Common Lisp,所以请原谅意大利面条代码和不理解。
我的问题如下:我想编写一个执行set的函数 - 操作A \ B,其中A和B设置非空。它们由两个列表表示。 到目前为止,我想出了这个:
(defun myDifference (a b)
(if (null a)
(return-from myDifference) ;when a hits NIL, get outta the whole function
)
(if (not(member (car a) b)) ; if the first element of A ist not in B, add it to a list (which later should be the return)
(cons (car a) '())
)
(myDifference (cdr a) b) ; proceed with the remaining elements of A, until (null a) hits
)
我尝试过:
(myDifference '( 1 2 3) '(1 5 6))
但是输出是NIL,无论我在哪个列表上尝试它。 我怀疑退出该功能时会出现问题。
答案 0 :(得分:3)
您的my-difference
正文中有3个表达式。如果nil
(null a)
第二个计算(list a)
或(list)
,然后丢弃该值。
第三次递归改为(cdr a)
。
很明显,此必须返回nil
,因为最后一个eventuelly以a
成为nil
进行递归,然后递归返回{ {1}}因为当您没有提供值时,这是默认值。更好的方法是使它成为这样一个表达式:
nil
(defun my-difference (a b)
(if (null a)
a
(if (not (member (car a) b))
(cons (car a) (my-difference (cdr a) b))
(my-difference (cdr a) b))))
的第三部分是if
部分,正如您所见,我们将其嵌套以获得与其他语言else
类似的内容。这可以用if-elseif-else
:
cond