Scheme Cons从2个列表中创建一个列表



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

我有两个列表:一个是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将其放回一起。

但我的问题是:我做了一个函数,它应该把两个列表构造成一个,但它不起作用,并给了我在函数定义中使用的名称。

这是代码:

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

结果:

((List1) List2) 

我做错了什么?我该怎么解决?

您所称的列表中的字符通常被称为其"元素"。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)

相关内容

  • 没有找到相关文章

最新更新