Scheme drRacket:关于列表

Scheme drRacket:关于列表,scheme,racket,Scheme,Racket,所以我有三张清单 (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的列表 我想做的是,如果我想 列表1-列表2='(1 3 4 6 7 9 11 12 14 15 16 18 19 20) 或者, 列表1-列表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的列表

我想做的是,如果我想 列表1-列表2='(1 3 4 6 7 9 11 12 14 15 16 18 19 20)

或者, 列表1-列表3=(2 3 5 6 10 11 12 14 16 17)

我尝试使用列表的长度,但不起作用,但我希望保留所有list1值,list3中的重复值除外

还有,我想做什么 list1-list2然后,将list1-list2的结果存储在list1上,然后执行另一个减法,如

  • 列表1-列表2
  • 将#1的结果存储在列表1中
  • 列表1-列表3

  • 有人能给我一些解决办法吗?非常感谢你

    我们可以取消第2步“将#1的结果存储在列表1中”吗?那种突变只会让我得麻疹

    我认为您只是试图从列表1中删除列表2和列表3中的元素。您可以这样做:

    (remove* (append list2 list3) list1)
    
    收益率

    '(3 7 11 12 14 16 17)
    

    你在研究集合论吗?如果是这样,(remove*)解决了问题,但它不是描述集合差异的过程

    设置差异是\B的定义是:
    A\B={x,这样x在A中而x不在B}

    因此,您需要一个过程来告诉您元素是否在列表中。那么您的
    差异
    代码如下所示:

    (define difference
      (λ (A B)
        (remove* (list #f) (map 
         (λ (x) 
           (if (not (in x B))
             x
             #f
             )) A))))
    
    在上面的例子中,我使用remove*,我认为它不是很优雅,所以为什么不尝试递归呢?最后是球拍:)

    请注意,在
    difference2
    中,我没有使用映射或删除

    reverse
    功能仅用于您希望对结果进行排序的情况

    分析这两个例子,试着理解我在做什么,然后发布你的结果

    让我们知道任何疑问

    编辑: 哦,还有一个问题,就是把操作的值赋值给另一个变量(C++类),你可以像C++那样做。p

    范例

    (define C (sum A B)) 
    


    这是一个很好的答案,但是要求用户改变他试图解释其想法的方式,而不给他一个应该如何做的提示,是没有用的。在您给我的第二个示例中,((不是(在(汽车a)B中))(差异2(cdr a)B(cons(汽车a)res)))是的,它是未绑定的,因为我希望您对其进行编码。想象一下,就像你在盒子里寻找一个特定的玩具,你拿起你抓到的第一件东西,检查它是否是你要找的,如果不是,扔掉它,继续盒子里的其他玩具(检查),直到你完成为止。让我们知道任何疑问!还可以尝试使用递归对其进行编码,就像我给您的第二个代码示例一样。
    (define C (sum A B)) 
    
    (define foo (+ (* pi x) (* 6 sigma)))