首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方案-笛卡尔乘积与“地图”?

方案-笛卡尔乘积与“地图”?
EN

Stack Overflow用户
提问于 2016-10-26 18:48:21
回答 1查看 1.8K关注 0票数 1

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

代码语言:javascript
运行
复制
(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个不同的向量:

代码语言:javascript
运行
复制
#'(a 1) #'(a 2) #'(a 3)

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

代码语言:javascript
运行
复制
'(#'(a 1) #'(a 2) #'(a 3) #'(b 1) #'(b 2) #'(b 3))

但我意识到我会得到这样的结果:

代码语言:javascript
运行
复制
'((#'(a 1) #'(a 2) #'(a 3)) (#'(b 1) #'(b 2) #'(b 3)))

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

现在我又回到了原点,我没有想法了。救命啊..。应该指出,这是一项学校作业,除简单的函数外,我不允许使用任何预定义的函数:

代码语言:javascript
运行
复制
cdr,car,cons,map etc

尽量保持最基本的状态。我只使用了大约一个月的计划,所以请放心:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-26 19:36:16

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

代码语言:javascript
运行
复制
(define (cartesian-product lst1 lst2)
  (apply append
         (map (lambda (x)
                (map (lambda (y)
                       (vector x y))
                     lst2))
              lst1)))

它如预期的那样运作:

代码语言:javascript
运行
复制
(cartesian-product '(1 2 3) '(a b))
=> '(#(1 a) #(1 b) #(2 a) #(2 b) #(3 a) #(3 b))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40269997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档