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

时间:2016-08-29 14:44:33

标签: dictionary recursion racket

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

((1 2 3)) -> ((1) (2) (3))
((1 2) (3 4)) -> ((1 3) (1 4) (2 3) (2 4))

我正在查看我的一些旧代码,并且无法弄清楚为什么它在外部循环中附加地图而不仅仅是地图?在Racket有更多经验的人可以向我解释一下吗?

(define cartesian-product
  (lambda (s)
    (if (null? s)
        '(())
        (append-map (lambda (el1)
                      (map (lambda (el2)
                             (cons el1 el2))
                           (cartesian-product (cdr s))))
                    (car s)))))

1 个答案:

答案 0 :(得分:1)

因为您需要压扁递归调用cartesian-product返回的列表,否则您将获得大量不受欢迎的子列表,看看如果我们不使用{会发生什么{1}}:

append-map

将其与展平列表的结果进行比较:

(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))))