所以我有3个名单。
(define list1 '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 15 16 17 18 19 20))
(define list2 '(2 5 6 8 10))
(define list3 '(1 4 8 9 13 15 18 19 20 25 27 29 ))
首先,列表1是一个包含1到20的列表。
我想做的是,如果我想 list1 - list2 ='(1 3 4 6 7 9 11 12 13 14 15 16 17 18 19 20)
,或者 list1 - list3 =(2 3 5 6 10 11 12 14 16 17)
我尝试了列表的长度但没有工作,但我想保留除list3的重复值以外的所有list1值。
另外,我想做 list1 - list2然后,将list1-list2的结果存储在list1上,然后执行另一个减法操作,
任何人都可以给我一些解决方案吗?非常感谢你!
答案 0 :(得分:2)
你在使用Set Theory吗?如果是这样,(删除*)解决了问题,但它不是描述集合差异的过程。
设置差异是A \ B定义为:
A\B={x,such that x is in A and x is not in B}
因此,您需要一个程序,告诉您某个元素是in
列表。然后,您的difference
代码将如下所示:
(define difference
(λ (A B)
(remove* (list #f) (map
(λ (x)
(if (not (in x B))
x
#f
)) A))))
在上面的例子中,我使用remove *,在我看来它不是很优雅,所以为什么不尝试递归呢?最后它的球拍:)。
(define difference2
(λ (A B res)
(cond
((empty? A) (reverse res))
((not (in (car A) B)) (difference2 (cdr A) B (cons (car A) res)))
(else (difference2 (cdr A) B res))
)))
请注意difference2
我如何不使用地图或删除。
仅在您希望订购结果时使用reverse
函数。
分析这两个例子,尝试了解我在做什么并发布结果。
让我们知道任何疑问!
修改强> 哦,关于将操作值赋值给另一个变量(如C ++)的另一个问题,你可以像在C ++中那样做。 :P
实施例
(define C (sum A B))
或
(define foo (+ (* pi x) (* 6 sigma)))
答案 1 :(得分:0)
我们可以摆脱你的第2步,"将#1的结果存储在列表1"?那种突变只是给了我荨麻疹。
我认为您只是尝试从列表1中删除列表2和列表3中的元素。您可以这样做:
(remove* (append list2 list3) list1)
...产量
'(3 7 11 12 14 16 17)