计划 - 笛卡尔产品与' map'?

时间:2016-10-26 18:48:21

标签: list dictionary vector scheme cartesian-product

我正在尝试编写一个函数,在' map'的帮助下返回2组(列表)的笛卡尔积。函数,我希望返回列表中的每对元素都是一个向量。

(cartesian-product '(1 2 3) '(a b))

'(#(3 a) #(3 b) #(2 a) #(2 b) #(1 a) #(1 b))

我最初的想法是创建一个单独的过程,使第2组中的向量输出元素c(常量)和第1组中的元素n,其中元素n在每次迭代时发生变化,然后继续将第2个单独的函数映射到第2组。因此,例如,如果我使用上面的列表(在代码示例中),我将从这个单独的函数中获得3个不同的向量:

#'(a 1) #'(a 2) #'(a 3)

在使用地图时,我会得到结果:

'(#'(a 1) #'(a 2) #'(a 3) #'(b 1) #'(b 2) #'(b 3))

但我意识到我会得到一个看起来像这样的结果:

'((#'(a 1) #'(a 2) #'(a 3)) (#'(b 1) #'(b 2) #'(b 3)))

因为单独的函数必须是递归的,所以在完成时必须返回一个列表。

现在我回到原点,我没有想法。请帮忙... 应该提到这是一个学校作业,我不允许使用任何预定义的功能,除了简单的功能,如:

cdr,car,cons,map etc

尽量保持基本。我只使用了一个月的Scheme,所以对我很轻松:)

1 个答案:

答案 0 :(得分:2)

我们可以嵌套两个map并在最后展平结果,确保在正确的位置创建vector

(define (cartesian-product lst1 lst2)
  (apply append
         (map (lambda (x)
                (map (lambda (y)
                       (vector x y))
                     lst2))
              lst1)))

按预期工作:

(cartesian-product '(1 2 3) '(a b))
=> '(#(1 a) #(1 b) #(2 a) #(2 b) #(3 a) #(3 b))