方案 - 'map' 的笛卡尔积?

Scheme - Cartesian product with 'map'?

我正在尝试编写一个函数,在 'map' 函数的帮助下,return 是 2 个集合(列表)的笛卡尔积,我想要 [=] 中的每对元素31=]ed 列表是一个向量。

(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. 例如,如果我使用上面的列表(在代码示例中),我将从这个单独的函数中获得 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)))

因为单独的函数必须是递归的,并且完成后必须 return 一个列表。

现在我回到原点,我没主意了。请帮忙... 应该提到这是一项学校作业,我不允许使用任何预定义函数,除了简单的函数,比如:

cdr,car,cons,map etc

尽量保持基本。我只使用 Scheme 大约一个月所以对我放轻松 :)

我们可以嵌套两个 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))