在球拍/方案中使用参数前面的缺点

时间:2015-10-31 13:40:07

标签: scheme racket cons

我知道cons用于构建对,例如(cons 2 (cons 3 empty)),但我不理解这里使用cons empty之后的代码。是不是cons为数字而建? cons怎么能得到2个论点?如果他们可以采取2个论点,它如何评估它们?并且有人可以在[(empty? lst) empty]之后翻译代码。

(define (removed2 lst)
  (cond
       [(empty? lst) empty]
       [(not (member? (first lst) (rest lst)))
        (cons (first lst) (removed2 (rest lst)))]
       [else (removed2 (rest lst))])

1 个答案:

答案 0 :(得分:2)

我建议你阅读一本关于Scheme的好书或教程,你要求解释一些最基本的概念,在开始编码之前应该很好理解方案。例如,这个chapter是一个很好的起点。我会解答你的问题:

  

我知道cons用于构建对,例如(cons 2 (cons 3 empty))

事实上,你可以构建一对你需要的任何 ...数字对,成对对,你可以命名。

  

但我不理解这里使用consempty的代码。

在这种情况下,empty表示空列表'()。因此,我们可以构建一个对,其中第一个元素是一个原子(在这种情况下是一个数字),第二个是一个空列表 - 这就是我们如何在Scheme中构建正确的列表!

  

Isn&#t; t cons是否为数字而建?

不,它是用于构建任何对,包括其他对。

  

cons怎么能拿2个参数?如果他们可以采用2个参数,那么它如何评估它们呢?

为什么不呢?正如您已经说过的那样,cons用于构建。一对由两件事组成,因此cons需要2个参数。它依次评估它们中的每一个,然后将它们粘在一起形成一对。你应该真的,真的阅读documentation

  

有人请在[(empty? lst) empty]之后翻译代码

那只是询问我们递归遍历的列表是否为空,如果是,则返回一个空列表 - 返回列表的任何递归过程的基本情况。该过程只是构建一个列表作为结果,因为cons元素成对,最后一对以空列表结束,产生一个正确的列表。基本上,这是您在Scheme中构建列表的方式:

(cons 1 (cons 2 (cons 3 empty)))
=> '(1 2 3)