Scheme Cons用于创建2个列表中的列表

时间:2015-11-13 14:06:36

标签: list scheme racket cons

所以,我在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)

现在,我有一个关于如何做到这一点的想法,其中涉及"切割"它使用缺点并使用缺点将它们放回原处,在使用缺点后附加"附加"信件。

这是我的问题: 我创建了一个函数,它应该将2个列表构造成一个,但它不起作用并给出了我在函数define中使用的名称。

以下是代码:

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

结果:

((List1) List2) 

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

1 个答案:

答案 0 :(得分: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)