Scheme函数从另一个列表项中删除一个列表项

时间:2011-06-02 01:20:00

标签: list function null scheme

我正在尝试创建一个方案函数,给出两个列表L1和L2,将从L1中删除L2中存在的任何项目。

我有一个小小的开始,但我不知道到底还能做什么。

(define (remove L1 L2)
(((null? L2) L1))

2 个答案:

答案 0 :(得分:1)

以下是简单案例的代码段。

(define (remove L1 L2)
  (cond ((null? L1) '())
        ((memv (car L1) L2) (remove (cdr L1) L2))
        (else  (cons (car L1) (remove (cdr L1) L2)))))

请记住,在Scheme或任何函数式语言中,您需要提出的问题不是“我应该做什么?”,而是您应该问“我有什么价值需要制作?“

请注意,此简单示例不处理嵌套列表。因此(remove '(A (C D)) '(B C D))会生成(A (C D))。处理嵌套列表留给读者练习:D

答案 1 :(得分:0)

您只需使用SRFI 1lset-difference

即可
(lset-difference = '(1 2 3 4 5) '(3 4 5 5 6))
; => (1 2)

在我的例子中,=是比较函数。如果您的列表包含字符串,而不是数字,则应使用string=?代替=