【问题标题】:Scheme Cons to create a list out of 2 listsScheme Cons 从 2 个列表中创建一个列表
【发布时间】:2015-11-15 06:19:25
【问题描述】:

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

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

【问题讨论】:

  • 这不是你写的代码。如果您需要解释,请发布您实际拥有的代码。使用复制和粘贴,不要重新输入。
  • 我怀疑你写了(cons '(List1) '(List2))。除非你有意,否则不要引用 (') 的东西。 (如果你不知道引用是什么意思,你可能根本不想这样做。)转到 DrRacket 中的交互式窗口,玩弄cons 和各种列表和其他表达式,看看会发生什么。

标签: list scheme racket cons


【解决方案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)

【讨论】:

  • 这并没有真正让他更接近解决方案。 append 接受两个列表参数 lst1 lst2 并创建一个新列表,如 psuedocode: (lst1[0] lst1[1] ... lst1[n] lst2[0] lst2[1] ... lst2[n])
  • 他需要将两个列表压缩在一起,但修改较短的列表,使其长度为>eq?到较长的列表。
  • 在尝试寻找解决方案时,他定义了一个辅助函数match,它应该附加。我的回答应该有助于解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2018-03-10
  • 2021-12-08
相关资源
最近更新 更多