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