创建一个函数来配对2个列表中的相应元素

时间:2017-02-11 04:35:00

标签: dictionary scheme lisp racket fold

我正在学习如何使用方案和练习,从我在书中看到的练习问题创建功能。这个名为zipper。 我已经使用仅zipperconscar的递归来创建cdr函数。 现在,我正在尝试再次使用mapfold同样的功能。 该功能包含两个列表和' zips'他们在一起:

 (zip '(1 2 3) '(4 5 6))
 ==> '((1 4) (2 5) (3 6))

如何使用mapfold执行此操作?

2 个答案:

答案 0 :(得分:1)

如果地图使用的函数是单独声明的话,可能会更清楚:

(define (zip1 x y)
  (list x y))

(map zip1 '(1 2 3) '(4 5 6)) ; corresponding elements of 2 lists will be sent to zip1

由于zip1仅为“list”,因此以下也适用:

(map list '(1 2 3) '(4 5 6)) 

两者的输出:

'((1 4) (2 5) (3 6))

因此要做(zip L1 L2),不需要编写特殊的zip函数,只需执行(map list L1 L2)

这也可以用于任何数量的列表,例如(map list L1 L2 L3 L4)这可能比仅为2个列表制作的定制zip功能更有优势。

答案 1 :(得分:0)

map的Racket文档提供了以下示例:

> (map (lambda (number1 number2)
         (+ number1 number2))
       '(1 2 3 4)
       '(10 100 1000 10000))
'(11 102 1003 10004)

请注意,这与您尝试实现的非常相似,但是您可以映射+函数,而不是将list函数映射到两个列表中的相应元素之间,如下所示: / p>

> (map (lambda (number1 number2)
         (list number1 number2))
       '(1 2 3 4)
       '(10 100 1000 10000))
'((1 10) (2 100) (3 1000) (4 10000))

因此,zip函数变为:

(define (zip lst1 lst2)
  (map
   (lambda(elem1 elem2)
     (list elem1 elem2))
   lst1 lst2))