-1

我知道cons是为了构建对,比如(cons 2 (cons 3 empty)),但我不明白这里使用consafter的代码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))])
4

1 回答 1

2

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

我知道cons是为了建立对,比如(cons 2 (cons 3 empty))

事实上,你可以建立任何你想要的对…成对的数字,成对的对,你可以命名它。

但我不明白这里使用consafter的代码empty

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

不是cons为数字而建的吗?

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

怎么能cons接受2个论点?如果他们可以接受 2 个论点,它如何评估它们?

那么为何不?正如您已经说过的,cons用于构建。一对由两个东西组成,所以cons需要 2 个参数。它依次评估它们中的每一个,然后将它们粘在一起形成一对。您应该真的,真的阅读文档

有人可以请翻译后的代码[(empty? lst) empty]

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

(cons 1 (cons 2 (cons 3 empty)))
=> '(1 2 3)
于 2015-10-31T15:07:02.453 回答