【问题标题】:Creating a function to pair the corresponding elements in 2 lists创建一个函数来配对 2 个列表中的相应元素
【发布时间】:2017-02-11 04:35:00
【问题描述】:

我正在通过从书中看到的练习题创建函数来学习使用方案和练习。这个叫zipper。 我已经使用只有conscarcdr 的递归创建了zipper 函数。 现在我试图再次使用相同的功能,但也使用mapfold。 该函数接受两个列表并将它们“压缩”在一起:

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

如何使用mapfold 执行此操作?

【问题讨论】:

    标签: dictionary scheme lisp racket fold


    【解决方案1】:

    如果单独声明map要使用的函数可能会更清楚:

    (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 只是“列表”,以下也可以:

    (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 功能更具优势。

    【讨论】:

      【解决方案2】:

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

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

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

      > (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))
      

      【讨论】:

        猜你喜欢
        • 2020-05-15
        • 1970-01-01
        • 2020-10-26
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        相关资源
        最近更新 更多