所以,我在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)
我做错了什么,我该如何解决?
答案 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)