首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在递归笛卡尔乘积函数中附加映射而不是映射?

为什么在递归笛卡尔乘积函数中附加映射而不是映射?
EN

Stack Overflow用户
提问于 2016-08-29 14:44:32
回答 1查看 421关注 0票数 1

笛卡尔乘积函数接受列表列表,并返回一个元组列表,其中元素来自第一个位置中的第一个列表,元素来自第二个位置,等等。如下所示:

代码语言:javascript
运行
复制
((1 2 3)) -> ((1) (2) (3))
((1 2) (3 4)) -> ((1 3) (1 4) (2 3) (2 4))

我在看我的一些旧代码,不知道为什么它被附加在外部循环中而不是仅仅映射?有更多球拍经验的人能给我解释一下吗?

代码语言:javascript
运行
复制
(define cartesian-product
  (lambda (s)
    (if (null? s)
        '(())
        (append-map (lambda (el1)
                      (map (lambda (el2)
                             (cons el1 el2))
                           (cartesian-product (cdr s))))
                    (car s)))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-29 15:42:25

因为您需要扁平化递归调用cartesian-product返回的列表,否则您将得到大量不想要的子列表,看看如果我们不使用append-map会发生什么

代码语言:javascript
运行
复制
(define cartesian-product
  (lambda (s)
    (if (null? s)
        '(())
        (map (lambda (el1)
               (map (lambda (el2)
                      (cons el1 el2))
                    (cartesian-product (cdr s))))
             (car s)))))

(cartesian-product '((1 2 3) (4 5 6)))
=> '(((1 (4)) (1 (5)) (1 (6))) ((2 (4)) (2 (5)) (2 (6))) ((3 (4)) (3 (5)) (3 (6))))

将其与简化列表的结果进行比较:

代码语言:javascript
运行
复制
(define cartesian-product
  (lambda (s)
    (if (null? s)
        '(())
        (append-map (lambda (el1)
                      (map (lambda (el2)
                             (cons el1 el2))
                           (cartesian-product (cdr s))))
                    (car s)))))

(cartesian-product '((1 2 3) (4 5 6)))
=> '((1 4) (1 5) (1 6) (2 4) (2 5) (2 6) (3 4) (3 5) (3 6))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39209020

复制
相关文章

相似问题

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