在Common Lisp中设置操作A \ B

时间:2017-05-29 09:03:42

标签: set lisp common-lisp

我刚开始在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,无论我在哪个列表上尝试它。 我怀疑退出该功能时会出现问题。

1 个答案:

答案 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