0

所以,我在 Scheme 中有一个学校项目(在 Dr.Racket 环境中工作),这是一个短期的项目(请注意,我没有要求你们中的任何人为我做功课)。

我有 2 个列表:一个是 6 个或更多字符,另一个是 3 个字符。

我们要做的是以如下所示的方式组合它们:

List 1: (1 2 3 4 5 6 7 8)
List 2: (a b c)

对此:

(1 a 2 b 3 c 4 5 c 6 b 7 a 8)

现在,我对如何做到这一点有了一个想法,其中包括在使用 cons 将字母“附加”之后,将其“切割”成零件并使用 cons 将它们重新组合在一起。

不过,这是我的问题:我制作了一个应该将 2 个列表构造为一个的函数,但它不起作用,并给了我在函数定义中使用的名称。

这是代码:

(define (match List1 List2)
(cons (List1) (List2)))
(match (1 2 3) (5 7 8))

结果:

((List1) List2) 

我做错了什么,我该如何解决?

4

1 回答 1

1

您所说的列表字符通常称为“元素”。的第一个参数cons将被视为结果列表的单个元素,无论它是数字还是列表、列表列表等。在您的示例List1中就是一个这样的元素。

如果您熟悉一点数学,请考虑集合。一个集合可以包含例如数字,但它也可以包含其他集合,这些集合也被视为单个元素,而不管它们的内容如何。您正在搜索以合并两个列表的是一个经常调用的函数append。您应该能够相当容易地递归地自己定义它。

编辑:

(define (intertwine a b)
  (cond [(empty? a)  b]
        [(empty? b)  a]
        [else
         (cons (car a) (cons (car b) (intertwine (cdr a) (cdr b))))]))

(define (main a b)
  (reverse (intertwine (reverse (intertwine a b))
                       b)))

当您调用(main List1 List2)它时,中间步骤将如下所示:

(intertwine '(1 2 3 4 5 6 7 8) '(a b c))='(1 a 2 b 3 c 4 5 6 7 8)

(reverse '(1 a 2 b 3 c 4 5 6 7 8))='(8 7 6 5 4 c 3 b 2 a 1)

(intertwine '(8 7 6 5 4 c 3 b 2 a 1) '(a b c))='(8 a 7 b 6 c 5 4 c 3 b 2 a 1)

(reverse '(8 a 7 b 6 c 5 4 c 3 b 2 a 1))='(1 a 2 b 3 c 4 5 c 6 b 7 a 8)

于 2015-11-13T14:53:33.123 回答