我试图编写一个函数,它在“map”函数的帮助下返回2组(列表)的笛卡儿积,我希望返回列表中的每一对元素都是一个向量。
(cartesian-product '(1 2 3) '(a b))
'(#(3 a) #(3 b) #(2 a) #(2 b) #(1 a) #(1 b))
我最初的想法是创建一个单独的过程,使向量输出元素c(常数)在集合2中,元素n在集合1中更改,元素n在每次迭代中更改,然后继续用set 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
尽量保持最基本的状态。我只使用了大约一个月的计划,所以请放心:)
发布于 2016-10-26 19:36:16
我们可以嵌套两个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))
https://stackoverflow.com/questions/40269997
复制相似问题