drRacket:关于名单

时间:2014-11-25 02:26:29

标签: scheme racket

所以我有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上,然后执行另一个减法操作,

  1. list1 - list2
  2. 将#1的结果存储在list1中。
  3. list1 - list3
  4. 任何人都可以给我一些解决方案吗?非常感谢你!

2 个答案:

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