将列表的元素配对在一起
Pairing elements of lists together
我正在 Scheme 中创建一个名为 pair-elements 的函数,其规格如下。它需要一个包含多个子列表的列表,每个子列表必须只有两个元素(虽然我现在不检查这个)。它 returns 一个包含两个子列表的列表,一个包含每个给定子列表的第一个元素,另一个包含它们的第二个元素。这是它应该做什么的示例:
>(对元素'((a b)(c d)(e f)))
((a c e) (b d f))
这是我目前所拥有的。我已经能够使用此代码成功创建第一个子列表:
(define (pair-elements x)
(if (null? x)
null
(cons (caar x) (pair-elements (cdr x)))))
经过测试,结果如下:
>(对元素'((a b)(c d)(e f)))
(a c e)
这是朝着正确方向迈出的一步,但我不知道如何完成第二部分并将它们都放入列表中。我所有的尝试都导致了非常丑陋的输出。例如,我的一次尝试:
(cons (cons (caar x) (pair-elements (cdr x))) (cons (cdar x) (pair-elements (cdr x))))))
获取输出 ((a (c (e) (f)) (d) (e) (f)) (b) (c (e) (f)) (d) (e) (f )), 这显然有偏差。
谁能帮我完成这个功能?我是 Scheme 的新手,我绝对需要知道如何做这样的事情。制作子列表列表是我特别费劲的事情。
您的实施基本上是重新发明轮子 - 如果您使用内置过程 map
,这将容易得多,它可以满足您的需求;您只需将要应用于输入列表的每个元素的过程作为参数传递(在本例中为 first
和 second
):
(define (pair-elements lst)
(list ; create a new list with the two sublists
(map first lst) ; sublist of first elements of input list
(map second lst))) ; sublist of second elements of input list
我们可以更进一步,利用 map
可以接收多个列表作为输入的事实:
(define (pair-elements lst) ; process input list element-wise on each
(apply map list lst)) ; sublist and create a list with them
无论哪种方式,它都按预期工作:
(pair-elements '((a b) (c d) (e f)))
=> '((a c e) (b d f))
我正在 Scheme 中创建一个名为 pair-elements 的函数,其规格如下。它需要一个包含多个子列表的列表,每个子列表必须只有两个元素(虽然我现在不检查这个)。它 returns 一个包含两个子列表的列表,一个包含每个给定子列表的第一个元素,另一个包含它们的第二个元素。这是它应该做什么的示例:
>(对元素'((a b)(c d)(e f)))
((a c e) (b d f))
这是我目前所拥有的。我已经能够使用此代码成功创建第一个子列表:
(define (pair-elements x)
(if (null? x)
null
(cons (caar x) (pair-elements (cdr x)))))
经过测试,结果如下:
>(对元素'((a b)(c d)(e f)))
(a c e)
这是朝着正确方向迈出的一步,但我不知道如何完成第二部分并将它们都放入列表中。我所有的尝试都导致了非常丑陋的输出。例如,我的一次尝试:
(cons (cons (caar x) (pair-elements (cdr x))) (cons (cdar x) (pair-elements (cdr x))))))
获取输出 ((a (c (e) (f)) (d) (e) (f)) (b) (c (e) (f)) (d) (e) (f )), 这显然有偏差。
谁能帮我完成这个功能?我是 Scheme 的新手,我绝对需要知道如何做这样的事情。制作子列表列表是我特别费劲的事情。
您的实施基本上是重新发明轮子 - 如果您使用内置过程 map
,这将容易得多,它可以满足您的需求;您只需将要应用于输入列表的每个元素的过程作为参数传递(在本例中为 first
和 second
):
(define (pair-elements lst)
(list ; create a new list with the two sublists
(map first lst) ; sublist of first elements of input list
(map second lst))) ; sublist of second elements of input list
我们可以更进一步,利用 map
可以接收多个列表作为输入的事实:
(define (pair-elements lst) ; process input list element-wise on each
(apply map list lst)) ; sublist and create a list with them
无论哪种方式,它都按预期工作:
(pair-elements '((a b) (c d) (e f)))
=> '((a c e) (b d f))