方案 - '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))
我正在尝试编写一个函数,在 '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))